Регулярное выражение, вызывающее переполнение сегмента / стека - PullRequest
1 голос
/ 05 марта 2012

(или я так думаю) ...

Я использую boost :: xpressive в качестве механизма обработки регулярных выражений для анализа чего-либо, и я получаю segfault. Я подозреваю, что виноваты рекурсивность и мое плохое регулярное выражение, потому что GDB показывает более 300 стековых фреймов. Итак, вот мое (чувствительное к регистру) регулярное выражение в нотации perl / python:

begin([^e]+)e((?:[^b]|b(?!egin))+)

что я ожидаю, чтобы соответствовать

beginHEADER HEREeFOLLOWED BY SOME LONG LONG TEXT THAT GOES UNTIL NEXTbegin

с первым заглавным текстом ( HEADER HERE ) в первой группе и вторым заглавным текстом во второй группе. Я всегда получаю сегфо, если текст, который должен соответствовать группе 2, очень длинный.

Почему это не должно работать?

1 Ответ

5 голосов
/ 05 марта 2012

Вы можете значительно упростить свое регулярное выражение, просто используя не жадное сопоставление :

begin(.+?)e(.+?)begin

Попробуйте и посмотрите, работает ли оно лучше.

Этовероятно, что ваше исходное регулярное выражение вызывало переполнение стека из-за рекурсивной реализации группировки | или в вашем регулярном выражении, которая потенциально разветвлялась с каждым отдельным символом во второй группе.

Простой нес другой стороны, жадный .+? не нуждается в ветвлении для каждого символа.

...