Vous exécutez catastrophic backtracking en répétant un groupe contenant des quantificateurs répétés. L'explosion combinatoire qui suit va alors (avec suffisamment d'entrée) conduire à un débordement de pile (tada!).
simplifié, votre regex tente de
(.*\.\s*)
match de toute succession de caractères y compris des points et des espaces, suivi d'un point, suivi par un ou plusieurs espaces, puis
(...)*
répéter cela autant fois.
Dendryt
Alors seulement il essaye de faire correspondre "Dendryt".
Comme cela échoue, le moteur revient en arrière, en essayant une permutation différente. Les possibilités sont presque infinies ...
Pour illustrer, voici une capture d'écran du débogueur regex RegexBuddy sur une version simplifiée de vos données:
RegexBuddy Screen Shot http://img714.imageshack.us/img714/3275/screen017.png
Le moteur donne après 1 million de permutations.
Votre regex serait un peu mieux comme ça (ne pas oublier de les backslashs lors de la conversion à une chaîne Java):
(.*)(\.\s*)*+Dendryt
Dans ce cas, le *+
, un soi-disant quantificateurs possessifs , refusera de revenir en arrière une fois qu'il a correspondu. De cette façon, le moteur regex peut échouer beaucoup plus rapidement, mais il est toujours mauvais car (.*)
correspond à n'importe quoi, même les points.
([^.]*)(\.\s*)*+Dendryt
est sûr, sauf si vos données peuvent contenir des points avant le "bit en pointillés". Dans l'ensemble, s'il vous plaît énoncer vos exigences un peu plus clairement, alors une meilleure regex peut être construite.
Merci beaucoup, c'était très utile! :) –