Можно ли как-то вытащить конструкцию группировки из результата поиска регулярного выражения?

159
03 мая 2019, 01:40

Собственно говоря код

const char *first = "фывфыв@NameOfElement(pupa i lupa)вфывфыв"; 
const char *last = first + strlen(first);
cmatch mr; 
regex rx("@NameOfElement\((.*?)\)"); 
    regex_search(first, last, mr, rx);

cout << mr.str();

Вывод выглядит так: @NameOfElement

насколько я понимаю регулярные выражения (а делаю я это плохо), то конструкция вида

  (.*?)

это так называема capturing group, которая в моей регулярке соответствует тексту внутри скобок аннотации, могу ли я каким-либо образом выудить ее из результатов поиска?

Answer 1

Нужно использовать .str(1) объекта типа cmatch (или smatch):

const char *first = "фывфыв@NameOfElement(pupa i lupa)вфывфыв"; 
const char *last = first + strlen(first);
cmatch mr; 
regex rx(R"(@NameOfElement\((.*?)\))"); 
regex_search(first, last, mr, rx);
cout << mr.str(1); // => pupa i lupa

См. демо онлайн.

Я использовал raw string literal, R"(@NameOfElement\((.*?)\))", это эквивалент "@NameOfElement\\((.*?)\\)". Кстати, лучше заменить .*? на [^)]* или [^()]* (=ноль и более символов, отличных от ) / ().

READ ALSO
как выделить блок памяти в c++ [закрыт]

как выделить блок памяти в c++ [закрыт]

вот так выглядит все задание полностью - Основной поток создает два других потока приостановленными и после их создания запускает первыйПервый...

151
Решение задачи с Yandex.Контест

Решение задачи с Yandex.Контест

Не могу решить эту задачу, не проходит по времени

131
Разный порядок операторов

Разный порядок операторов

Почему эта программа не выдаёт ошибок для 1 и 2 строки, но выдаёт их для 3 и 4?

167