Si vous voulez en termes simples, le moteur d'expressions régulières n'est pas une lavette - si au premier abord il ne réussit pas, il va sauter de nouveau et d'essayer encore et encore, toutes les combinaisons possibles, jusqu'à ce qu'il trouve une correspondance.
Je vais prendre un modèle inspiré par le premier exemple que vous avez donné et sort pour vous:
^((ab)*)+$
Compte tenu de l'entrée:
ababab
Le moteur d'expressions régulières essaie quelque chose comme (ababab)
et une correspondance est trouvée sur le premier essai. Yay!!! Mais alors nous jeter les bâtons dans:
abababa
Le moteur d'expressions régulières essaie (ababab)
mais qui échoue à cause de l'extra - a
. Mais n'ayez pas peur, notre intrépide moteur d'expressions régulières essaie à nouveau, cette fois avec quelque chose comme (abab)(ab)
. Mais cela ne fonctionne pas non plus. "OK," dit-il à lui-même, "le temps de la boucle vers le bas et les résoudre."
(ababab)
- Nope
(abab)(ab)
- Nope
(ab)(abab)
- Nope
(ab)(ab)(ab)
- Nope
()(ababab)
- Nope
()(abab)(ab)
- Nope
()(ab)(abab)
- Nope
()(ab)(ab)(ab)
- Nope
...
Avant de vous le savez, le moteur d'expressions régulières est de manger toutes les ressources de votre système en essayant de résoudre cette chose jusqu'à ce que, après avoir épuisé toutes les combinaisons possibles des termes, il abandonne finalement et se tourne vers vous en disant: "Ce n'est pas un match." En regardant en arrière, derrière le moteur d'expressions régulières, vous pouvez voir votre serveur, un bûcher de métal en fusion.
Comme pour l'identification de ces expressions régulières, il peut effectivement être très difficile. J'ai écrit un couple moi-même, même si je sais ce qu'ils sont et de manière générale, comment les éviter. Voir Regex prendre très longtemps. Emballage tout ce que vous pouvez dans un atomiques groupe peut aider à prévenir la mandature question. Il raconte essentiellement le moteur d'expressions régulières de ne pas essayer de multiples combinaisons - "si à première vous ne réussissez pas, fuyez!".
Malheureusement, une fois que c'est écrit, c'est vraiment très dur, immédiatement ou à trouver rapidement un problème de regex. En fin de compte, la reconnaissance d'un mauvais regex, c'est comme la reconnaissance d'un autre mauvais code, il faut beaucoup de temps et d'expérience et/ou un seul événement catastrophique.
(NOTE: La "correspond à" sont à titre indicatif seulement. L'ordre des matches dépend un peu sur le moteur d'expressions régulières, mais vous obtenez l'essentiel.)