2012-03-05 2 views
1

(или я так думаю) ...Регулярного выражения переполнение вызывает выдаст ошибку сегментации/стек

Я использую подталкивание :: Xpressive как мои регулярные выражения, чтобы разобрать что-то и я получаю Segfault. Я подозреваю, что виновата рекурсия и мое плохое регулярное выражение, потому что gdb показывает более 300 кадров стека. Итак, вот мое (чувствительно к регистру) регулярное выражение в Perl/питон нотации:

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

, который я ожидал, чтобы соответствовать

beginHEADER HEREeFOLLOWED BY SOME LONG LONG TEXT THAT GOES UNTIL NEXTbegin 

с первым прописным текстом (HEADER ЗДЕСЬ) в первая группа и второй заглавный текст во второй группе. Я всегда получаю segfault, если текст, который должен соответствовать группе 2, очень длинный.

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

ответ

5

Вы можете упростить регулярное выражение много, просто используя non-greedy matching:

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

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

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

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

+0

Я бы сохранил '[^ e] +' в левой части, это, вероятно, будет работать лучше. – Benoit

+0

Спасибо, сейчас работает. Это отталкивающее мышление. – dsign

+0

Кроме того, xpressive работает намного лучше при компиляции в режиме release (может быть, хвостовая рекурсия помогает?). – dsign

 Смежные вопросы

  • Нет связанных вопросов^_^