Почему это регулярное выражение совпадает в 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).

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

1

Другие решения


По вопросам рекламы [email protected]