Выражения регулярных выражений в c ++ - PullRequest
0 голосов
/ 06 августа 2020

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

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

Hi  (AnyThingCanGoHereExcept")")

Мое регулярное выражение: Hi *\(.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Я бы попробовал что-то вроде этого (см. Пример ниже).

Пары скобок полезны для захвата подвыражений.

Первое подвыражение (Hi ) должно стоять в начале (^).
Ожидается сама открывающая скобка ([(]).
Все, что не является закрывающей скобкой ([^)]), может повторяться в любое время (* ); это второе подвыражение.
Ожидается сама закрывающая скобка ([)]).
Наконец, все остальное (.*) принимается (третье подвыражение) до конца ($ ).

/**
  g++ -std=c++17 -o prog_cpp prog_cpp.cpp \
      -pedantic -Wall -Wextra -Wconversion -Wno-sign-conversion \
      -g -O0 -UNDEBUG -fsanitize=address,undefined

  <Hi (abc)def>
    1 <Hi >
    2 <abc>
    3 <def>
  <Hi (abc)def)ghi>
    1 <Hi >
    2 <abc>
    3 <def)ghi>
  <Hi there>
**/

#include <iostream>
#include <regex>

int
main()
{
  const auto re=std::regex{"^(Hi )[(]([^)]*)[)](.*)$"};
  for(const auto &s: {"Hi (abc)def", "Hi (abc)def)ghi", "Hi there"})
  {
    auto m=std::cmatch{};
    std::cout << "<" << s << ">\n";
    if(std::regex_match(s, m, re))
    {
      std::cout << "  1 <" << m[1] << ">\n";
      std::cout << "  2 <" << m[2] << ">\n";
      std::cout << "  3 <" << m[3] << ">\n";
    }  
  }
  return 0;
}
0 голосов
/ 06 августа 2020

Примерно так:

Hi *\([^)]*\)

[...] обозначает класс символов , соответствует любому одному символу , содержащемуся в скобках. Начальный ^ внутри скобок создает класс, который соответствует любому , кроме , что указано в скобках. Следовательно, [^)] будет соответствовать любому символу, кроме ), а следующий * количественно определяет любое количество символов, отличных от ).

В диалектах регулярных выражений, которые поддерживают нежадную модификацию квантификаторы, вы можете сделать то же самое, используя .*?:

  • .* будет соответствовать как можно большему количеству совпадений, в то же время позволяя совпадать остальной части шаблона.
  • .*? будет соответствовать little , насколько это возможно, при этом оставшаяся часть шаблона будет соответствовать.
Hi *\(.*?\)

В этом выражении .*? не может соответствовать ), потому что это не будет соответствовать как можно меньше, учитывая, что в шаблоне следует только ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...