Почему это регулярное выражение совпадает в pcregrep, но не в моем коде C++?

У меня есть регулярное выражение, которое прекрасно работает с 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++?

1 ответ

Решение

Ваше первое регулярное выражение:

 ( [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).

Если это не сработает, это что-то еще.

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