2016-05-23 2 views
1

У меня есть следующий РегВырRegex вызывает StackOverflowError

(([^'])|(''))* 

который разобрать литералов достаточно хорошо обычно

но со следующим текстом (можно попробовать):

xxxxxxx_xxx_xxxxxxx=xxxxxx.xxxxxxxxxxx.xxxxxxx.xxxxxxxxxx`2[xxxxxx.xxxxxx,xxxxxx.xxxxxx]xxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxxxxxx=1455544499467&xxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xx=xxxxxxx &xxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxx=xxxxxxx_701454xx-x23x-4x31-xx75-xxx185x3xx26&xxxxxx_xxxxxxxx_xxx_xxxxxxxxxx=xxxxx&xxxxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxx=xxxxxxx&xxxxxxxx_xxx_xx=xxxxxxx_2x542x7x-7x94-4867-8819-239x732xx3x1&xxxxxxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxxxx=xxxxx&xxxxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxxx=xx-xx&xxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxx=7&xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxx=xxx2012x2xx.xxx.xxx:82&xxxxxxx_xxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxx=11.0&xxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxx=xxxx&xxxxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxx=xxxxxxxxx&xx_xxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxx=xx 6.3&xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxxxxxxxx=<xxxxxxx-xxxxx xxxxx="xxx">xxxxxx xxxxxx"></xxxxxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxx" xxxxxxxx="xxxx" xxxx="xxxxxxxxxxx xxxx"><xxxx-xx-xxxxxx xxxxxxxxxxx="xxxx"><xxxxx>xxxxxxxxxx</xxxxx><xxxxx>xxxxx</xxxxx><xxxxx>xxx</xxxxx><xxxxx>xxxxxxxxx</xxxxx><xxxxx>xxxxxxx</xxxxx></xxxx-xx-xxxxxx></xxxxxxx-xxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxxxxxx" xxxxxxxx="xxxxxxxx" xxxx="xx_xxxxxxxx"/><xxxxxxx-xxxx xxx-xxxxx="xx_xx_xxxxx" xxxxxxxx="xxxx" xxxx="xxxxxxx - xxxxxx xxxxxx?"><xxxx-xx-xxxxxx xxxxxxxxxxx="xxxxx"> 2</xxxxx></xxxx-xx-xxxxxx><xxxxx>xxxx</xxxxx><xxxxx>xxxxx</xxxxx></xxxx-xx-xxxxxx></xxxxxxx-xxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxx_xxxx" xxxxxxxx="xxxx" xxxx="xx_xxxx_xxxx"></xxxxxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxxxxx" xxxxxxxx="xxxxxx" xxxx="xx_xxxxxxx"></xxxxxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xx_xxxxxxxxxxxxxx_xxxxxx" xxxxxxxx="xxxx"xxxx="xxxxxxx - xxxxxxxxxxxxxx xxxxxx"></xxxxxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxxxx" xxxxxxxx="xxxx" xxxx="xxxxxxxxxxx xxxxxx">') 

Я получаю StackOverflowError:

Exception in thread "main" java.lang.StackOverflowError 
    at java.util.regex.Pattern$Branch.match(Pattern.java:4600) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4785) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717) 
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717) 
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658) 

В чем может быть проблема? Возможно ли иметь такое исключение из-за слишком большой длины строки (2030 символов)? Или у меня есть специальные символы здесь, которые вызывают эти ошибки?

Любые мысли оценили

+0

@anubhava он все еще имеет исключение – ServerSideCat

ответ

2

Прежде всего, вам не нужны внутренние группы перехвата. Повторяющиеся группы захвата захватывают только последнее событие, поэтому в Java они бесполезны.

Далее вы можете unroll это регулярное выражения так, чтобы он соответствовал линейно (без чередования, что съедает много ресурсов):

[^']*(?:''[^']*)* 

Смотрите updated regex демо. Подробнее

шаблон:

  • [^']* - сочетается с другими, чем '
  • (?:''[^']*)* ноль или более символов - соответствует нулю или более последовательностей:
    • '' - две одиночные апострофы
    • [^']* - ноль или более символов, кроме '
+0

Спасибо Wiktor. Помогает мне. Не могли бы вы посоветовать мне, как узнать regexp, чтобы хорошо знать об эффективном использовании? любые книги, курсы? – ServerSideCat

+0

Регулярные выражения OReiley's Mastering считаются лучшим учебником. Регулярно проверяйте SO, есть один парень, который отлично разбирается в производительности regex. Ну, их больше, но они часто не появляются. –

+0

Смотрите сообщения Casimir et Hyppolyte, им действительно интересно. nhahtdh также является гуру регулярного выражения (он даже живет на луне: -D) –

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