<select[^>]*>[^<]*(?:<(?!/select>)[^<]*)*</select>
... o en forma legible por humanos:
<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
Este es un ejemplo de la técnica de "ciclo desenrollado" que Friedl desarrolla en su libro, Mastering Regular Expressions. Hice una prueba rápida en RegexBuddy usando un modelo basado en los cuantificadores reacios:
(?s)<select[^>]*>.*?</select>
... y tardó unos 6.000 pasos para encontrar una coincidencia. El patrón desenrollado-bucle tomó solo 500 pasos. Y cuando eliminé el soporte de cierre de la etiqueta de cierre (</select
), imposibilitando una coincidencia, solo requirió 800 pasos para informar la falla.
Si su sabor expresión regular compatible con cuantificadores posesivos, seguir adelante y utilizarlos, también:
<select[^>]*+>[^<]*+(?:<(?!/select>)[^<]*+)*+</select>
Se tarda aproximadamente el mismo número de pasos para lograr una coincidencia, pero se puede utilizar mucho menos memoria en el proceso. Y si no es posible una coincidencia, falla aún más rápidamente; en mis pruebas tomó alrededor de 500 pasos, el mismo número que tardó en encontrar una coincidencia.
Puede usar cuantificadores posesivos.Puede proporcionar una entrada larga de muestra que hace que su ejecución de expresiones regulares sea más lenta. – Shekhar