Переполнение стека при использовании регулярного выражения в комментариях в стиле Java - PullRequest
0 голосов
/ 14 декабря 2011

В настоящее время я пишу парсер в Scala, где я хочу, чтобы мой пробел был определен как совпадающий как для пробела, так и для комментариев в стиле java /* */. Мне не нужна часть //.

В настоящее время я использую это определение:

"""((\s+)|(?:/\*(?:[^*]|(?:\*+[^*/]))*\*+/))*""".r

Я нашел большую часть этого определения на этой странице: http://ostermiller.org/findcomment.html

Проблема в том, что я получаю переполнение стека при сопоставлении моего ввода. Однако корректировка моего стека размером до 1 МБ решает проблему. К сожалению, это не возможно в моей производственной системе. Так что я спрашиваю, может ли кто-нибудь помочь мне улучшить мое регулярное выражение?

Помощь будет высоко ценится, так как я только новичок в мире регулярных выражений :)

Заранее спасибо.

С уважением, Стефан.

1 Ответ

0 голосов
/ 14 декабря 2011

Используйте шаблон normal* ( special normal*) * для комментариев.Вам потребуется многострочное сопоставление.

Здесь special - это *, за которым не следует /, а normal - это не что иное, как *.Без кавычек регулярные выражения

  • специальные - \*(?!/);
  • нормальные - [^*].

Я не знаю, scala, но вам нужночтобы определить одну переменную для особой, одну переменную для обычной, используйте:

/\*<normal>*(<special><normal>*)*\*/

, и это поглотит ваши пробелы без страха переполнения стека.

...