Мне было интересно, можно ли вызвать подпрограмму, но не зафиксировать результат этого вызова.
Например, предположим, что я хочу рекурсивно сопоставить и зафиксировать структуру сбалансированной скобки {}, например
{dfsdf{sdfdf{ {dfsdf} }}dfsf}
Я мог бы использовать это регулярное выражение:
(^(?'nest'\{(?>[^{}]|(?&nest))*\}))
первая группа - это то, что я хочу захватить.
Однако мое определение «гнезда»:
(?'nest' ... )
и мой рекурсивный вызов подпрограммы «гнездо»:
(?&nest)
также группы захвата. Я хотел бы сделать свое регулярное выражение более эффективным и сэкономить место, не захватывая эти группы. Есть какой-либо способ сделать это?
редактировать: я полагаю, что невозможно не захватить определение подпрограммы, поскольку ее шаблон необходимо зафиксировать для использования в другом месте.
редактировать2:
Я тестирую это регулярное выражение с помощью boost::regex, а также регулярного выражения notepad++. На самом деле они определяют разные группы захвата, что для меня странно. У меня сложилось впечатление, что они оба используют регулярное выражение Perl по умолчанию.
В любом случае, задав вопрос, у меня было регулярное выражение:
^\w+\s+[^\s]+\s+(?'header'(?'nest'\{(?>[^{}]|(?&nest))*\}))(?>\s+[^\s]+){5}\s+(?'data'(?>\{(?>[^{}]|(?&nest))*\}))\s+(?'class'(?>\{(?>[^{}]|(?&nest))*\}))
который, как я позже понял, содержал ненужные символы, которые уже инкапсулированы «гнездо». А у меня сейчас:
^\w+\s+[^\s]+\s+(?'nest'\{(?>[^{}]|(?&nest))*\})(?>\s+[^\s]+){5}\s+((?&nest))\s+((?&nest))
Notepad++ предоставляет мне 3 группы захвата, когда я делаю оператор замены
\\1: \1 \n \\2: \2 \n 3: \3 \n 4: \4
Он говорит мне, что «1 вхождение было заменено, следующее вхождение не найдено». В замене нет текста после 4:, что заставляет меня поверить, что 4-й группы захвата не существует.
ОДНАКО boost::regex_match возвращает объект с 6 позициями:
0: метаданные матча
1: весь матч
2: весь матч
3: группа1 из блокнота++
4: группа2 из блокнота++
5: группа3 из блокнота++
Я все еще пытаюсь отправить позиции 1 и 2.
редактировать3
Я неправильно понял еще одну часть головоломки...
boost::cmatch.m_subs[i] != boost::cmatch[i]
Я думал, что они равны. После еще некоторой отладки оказывается, что индексация в объект работает именно так, как написано в документации. Но я ошибочно предположил, что объект будет содержать структуру, отражающую то, что возвращает boost::cmatch[i]. Похоже, что boost::cmatch[i] сначала удаляет все записи из m_subs, которые соответствуют == false. Остальные записи совпадают с тем, что возвращает boost::cmatch[i].
{...}
в начале строки, нет, нет способа использовать вызов подпрограммы без захвата. - person Wiktor Stribiżew   schedule 15.06.2017May only be used to define functions. No matching is done in this group.
- person   schedule 15.06.2017boost::regex_match
соответствует полной входной строке. Если вы хотите заменить глобально, используйте функциюboost::regex_replace
. Можете ли вы опубликовать используемую целевую строку? - person   schedule 15.06.2017