Necesitamos tu apoyo para difundir nuestras secciones sobre las ciencias informáticas.
Solución:
Quiero agregar esta respuesta para una referencia rápida. Siéntase libre de actualizar.
expresión regular de .NET utilizando grupos de equilibrio.
((?>((?)|[^()]+|)(?<-c>))*(?(c)(?!)))
Donde c
se utiliza como contador de profundidad.
Demostración en Regexstorm.com
- Desbordamiento de pila: Uso de RegEx para equilibrar el paréntesis de coincidencia
- Blog desconcertante de Wes: Coincidencia de construcciones equilibradas con expresiones regulares de .NET
- Blog de Greg Reinacker: Construcciones anidadas en expresiones regulares
PCRE utilizando un patrón recursivo.
((?:[^)(]+|(?R))*+)
Demostración en regex101; O sin alternancia:
((?:[^)(]*(?R)?)*+)
Demostración en regex101; O desenrollado para el rendimiento:
([^)(]*+(?:(?R)[^)(]*)*+)
Demostración en regex101; El patrón se pega en (?R)
que representa (?0)
.
Perl, PHP, Bloc de notas++,R: perl=VERDADERO, Pitón: paquete Regex con (?V1)
para el comportamiento de Perl.
Rubí usando llamadas a subexpresiones.
Con Rubí 2.0 g<0>
se puede utilizar para llamar patrón completo.
((?>[^)(]+|g<0>)*)
Demostración en Rubular; Ruby 1.9 solo admite la captura de recursividad de grupos:
(((?>[^)(]+|g<1>)*))
Demostración en Rubular (agrupación atómica desde Ruby 1.9.3)
JavaScript API :: XRegExp.matchRecursive
XRegExp.matchRecursive(str, '\(', '\)', 'g');
JS, Java y otros sabores de expresiones regulares sin recursividad hasta 2 niveles de anidamiento:
((?:[^)(]+|((?:[^)(]+|([^)(]*))*))*)
Demostración en regex101. Es necesario agregar un anidamiento más profundo al patrón.
Para fallar más rápido en paréntesis desequilibrados, suelte el +
cuantificador
Java: Una idea interesante usando referencias directas de @jaytea.
Referencia – ¿Qué significa esta expresión regular?
- reexegg.com – Expresiones regulares recursivas
- Expresiones-regulares.info – Recursión de expresión regular
Las expresiones regulares son la herramienta incorrecta para el trabajo porque se trata de estructuras anidadas, es decir, recursividad.
Pero hay un algoritmo simple para hacer esto, que describí en esta respuesta a una pregunta anterior.
Puedes usar la recursividad de expresiones regulares:
(([^()]|(?R))*)
Acuérdate de que tienes la opción de agregar una reseña si te fue útil.