<select[^>]*>[^<]*(?:<(?!/select>)[^<]*)*</select>
... ou sous forme lisible par l'homme:
<select[^>]*> # start tag
[^<]* # anything except opening bracket
(?: # if you find an open bracket
<(?!/select>) # match it if it's not part of end tag
[^<]* # consume any more non-brackets
)* # repeat as needed
</select> # end tag
Ceci est un exemple de la technique de "boucle déroulée" que Friedl développe dans son livre, Mastering Regular Expressions. Je l'ai fait un test rapide à RegexBuddy en utilisant un modèle basé sur les quantificateurs réticents:
(?s)<select[^>]*>.*?</select>
... et il a fallu environ 6 000 mesures pour trouver une correspondance. Le motif à boucle déroulée n'a pris que 500 pas. Et quand j'ai enlevé le support de fermeture de l'étiquette de fin (</select
), rendant une correspondance impossible, il a fallu seulement 800 étapes pour signaler une défaillance.
Si votre goût regex soutient quantificateurs possessifs, allez-y et de les utiliser aussi:
<select[^>]*+>[^<]*+(?:<(?!/select>)[^<]*+)*+</select>
Il faut environ le même nombre d'étapes pour atteindre un match, mais il peut utiliser beaucoup moins de mémoire dans la processus. Et si aucune correspondance n'est possible, elle échoue encore plus rapidement; dans mes tests, il a fallu environ 500 pas, le même nombre que pour trouver un match.
Vous pouvez utiliser des quantificateurs possesifs.Vous pouvez fournir un exemple d'entrée longue qui ralentit l'exécution de votre regex. – Shekhar