Я написал код для поиска всех совпадений с шаблоном, например 23<=34
или 123<>2000
в данном файле. В более общем смысле a(sign)b
, где sign
∈ { =<
, =
, >
, <=
, <>
, >=
} и a
, b
∈ N.
Теперь я застрял на расширении этого кода, чтобы идентифицировать многие шаблоны суставов, такие как a(sign)b(sign)c(sign)...(sign)d
. Это напоминает мне поиск gcd
многих чисел, используя только gcd
для двух чисел. Но я действительно не знаю, как поступить. Предположим, что у нас уже есть функция solved()
, которая работает только для одной пары (при необходимости код ниже).
Резюме проблемы: Создание функции, которая более или менее выглядит так:
void solve(string text) {
// using solved(string text) [but optional]
}
Возможно, есть и другие способы, и я был бы более чем счастлив их увидеть!
Ниже приведен код, который у меня есть:
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <regex>
using namespace std;
#define REGEX_SIGN "(=<|=|>|<=|<>|>=)"
#define REGEX_DIGIT "[0-9]"
#define REGEX_NUMBER "[^0]\\d*"
void check(string text) {
regex sign(REGEX_SIGN);
regex digit(REGEX_DIGIT);
regex number(REGEX_NUMBER);
regex relation(REGEX_NUMBER REGEX_SIGN REGEX_NUMBER);
string word = "";
for (int i = 0; i < text.length(); i++) {
if (text[i] == ' ') {
regex_match(word, relation) ? cout << "✔️ " : cout << "☒ ";
cout << word << " ";
cout << endl;
word = "";
} else {
word += text[i];
}
}
}
int main() {
string line, text;
ifstream fin;
fin.open("name.txt");
if (fin.good()) {
while (getline(fin, line)) {
text += line + " ";
}
check(text);
}
return 0;
}
Кажется, вы ищете
REGEX_NUMBER "(" REGEX_SIGN REGEX_NUMBER ")+"
Демонстрация регулярных выражений с \d+((<|=|>|<=|<>|>=)\d+)+
@VIVID: обратите внимание, что я окружен ( .. )+
, родители для группировки, +
для повторения (1 или более).
Спасибо за демонстрации! Как избежать чисел, начинающихся с 0? Я добавил картинку в конце вопроса с вашим регулярным выражением. Сначала я попробовал себя, но это начинает принимать от =
. Как-то "не гладко".
REGEX_NUMBER
должно быть "(0|[1-9]\d*)"
(поскольку ноль должен быть действительным IMO).
Думаю, я понял тебя. Спасибо!
Сайт выполняет поиск вместо точного совпадения, вы можете использовать ^
и $
для начала и конца. Демо
На самом деле, эти скобки просто изолировали
sign
для объяснения проблемы.