Как расширить регулярное выражение, работающее для одной пары, на множество пар

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вы ищете

REGEX_NUMBER "(" REGEX_SIGN REGEX_NUMBER ")+"

Демонстрация регулярных выражений с \d+((<|=|>|<=|<>|>=)\d+)+

Демонстрация C++.

На самом деле, эти скобки просто изолировали sign для объяснения проблемы.

VIVID 22.12.2020 20:25

@VIVID: обратите внимание, что я окружен ( .. )+, родители для группировки, + для повторения (1 или более).

Jarod42 22.12.2020 20:36

Спасибо за демонстрации! Как избежать чисел, начинающихся с 0? Я добавил картинку в конце вопроса с вашим регулярным выражением. Сначала я попробовал себя, но это начинает принимать от =. Как-то "не гладко".

VIVID 22.12.2020 20:36
REGEX_NUMBER должно быть "(0|[1-9]\d*)" (поскольку ноль должен быть действительным IMO).
Jarod42 22.12.2020 20:39

Думаю, я понял тебя. Спасибо!

VIVID 22.12.2020 20:42

Сайт выполняет поиск вместо точного совпадения, вы можете использовать ^ и $ для начала и конца. Демо

Jarod42 22.12.2020 20:43

Другие вопросы по теме