У меня есть регулярное выражение, которое прекрасно работает с pcregrep
:
pcregrep -M '([a-zA-Z0-9_&*]+)(\(+)([a-zA-Z0-9_ &\*]+)(\)+)(\n)(\{)'
Теперь я попытался включить это регулярное выражение в мой код C ++, но он не совпадает (включая escape-коды):
char const *regex = "([a-zA-Z0-9_&*]+)\\(+([a-zA-Z0-9_ &\\*]+)\\)+(?>\n+)\\{+";
re = pcre_compile(regex, PCRE_MULTILINE, &error, &erroffset, 0);
Я пытаюсь найти функциональные тела, как это (абзац 0a
в шестнадцатеричном виде):
my_function(char *str)
{
Почему это работает с pcregrep
а не в коде C ++?
Ваше первое регулярное выражение:
( [a-zA-Z0-9_&*]+ ) # (1)
( \(+ ) # (2)
( [a-zA-Z0-9_ &\*]+ ) # (3)
( \)+ ) # (4)
( \n ) # (5)
( \{ ) # (6)
Ваш второй регулярное выражение:
( [a-zA-Z0-9_&*]+ ) # (1)
\(+
( [a-zA-Z0-9_ &\*]+ ) # (2)
\)+
(?> \n+ )
\{+
Кроме разных групп захвата и ненужной атомарной группы (?>)
есть одна вещь, которая явно отличается:
Последний перевод строки и фигурная скобка во втором регулярном выражении имеют +
кванторы.
Но это 1 или больше, поэтому я думаю, что первое регулярное выражение будет подмножеством второго.
Неочевидное отличие состоит в том, что неизвестно, были ли файлы открыты в переведенный режим или нет.
Обычно вы можете охватить все случаи \r?\n
на месте \n
,
(или даже (?:\r?\n|\r)
).
Итак, если вы хотите количественно определить разрыв строки, это будет (?:\r?\n)+
или же (?:\r?\n|\r)+
,
Другим вариантом может быть попытка построения перевода строки (я думаю, что его \R
)
вместо этого (доступно в новейших версиях pcre).
Если это не сработает, это что-то еще.