Я написал код для поиска всех совпадений с шаблоном, например 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для объяснения проблемы.