Вы сталкиваетесь с катастрофическим возвратом , повторяя группу, содержащую повторяющиеся квантификаторы.Последующий комбинаторный взрыв (при достаточном вводе) приведет к переполнению стека (tada!) .
Упрощенно, ваше регулярное выражение пытается
(.*\.\s*)
соответствоватьлюбая последовательность символов , включая точки и пробелы , за которыми следует точка, за которой следует ноль или более пробелов, а затем
(...)*
повторяют это любое количество раз.
Dendryt
Только тогда он пытается сопоставить «Дендрит».
Поскольку это не удается, двигатель возвращается назад, пробуя другую перестановку.Возможности почти безграничны ...
В качестве иллюстрации приведен скриншот отладчика регулярных выражений RegexBuddy в упрощенной версии ваших данных:
Снимок экрана RegexBuddy http://img714.imageshack.us/img714/3275/screen017.png
Движок отказывается после 1 миллиона перестановок.
Ваше регулярное выражение будет немного лучше, как это (не забудьте избежать обратной косой черты при преобразовании его в строку Java):
(.*)(\.\s*)*+Dendryt
В этом случае *+
, так называемый собственнический квантификатор, откажется откатываться после того, как его сопоставили.Таким образом, механизм регулярных выражений может выйти из строя намного быстрее, но он все еще плох, потому что (.*)
соответствует всему , даже точкам.
([^.]*)(\.\s*)*+Dendryt
безопасно, если ваши данные не могут содержать точекперед "бит пунктирной линии".В целом, пожалуйста, изложите ваши требования немного яснее, тогда можно будет создать более регулярное выражение.