Las expresiones regulares no pueden identificar estructuras recursivas . Esta es la limitación fundamental.
Tome JSON: es un formato bastante simple, pero dado que un objeto puede contener otros objetos como valores de miembros (arbitrariamente profundos), la sintaxis es recursiva y no puede ser analizada por una expresión regular. Por otro lado, CSV puede ser analizado por expresiones regulares, ya que no contiene ninguna estructura recursiva.
En pocas palabras, las expresiones regulares no permiten que el patrón se refiera a sí mismo. No puede decir: en este punto de la sintaxis coincide con todo el patrón nuevamente. Para decirlo de otra manera, las expresiones regulares solo coinciden linealmente, no contiene una pila que le permita realizar un seguimiento de cuán profundo es un patrón anidado.
Tenga en cuenta que no tiene nada que ver con lo complejo o complicado que es el formato de lo contrario. Las expresiones S son realmente muy simples, pero no se pueden analizar con una expresión regular. CSS2, por otro lado, es un lenguaje bastante complejo, pero no contiene estructuras recursivas y, por lo tanto, se puede analizar con una expresión regular. (Aunque esto no es cierto para CSS3 debido a las expresiones CSS, que tienen una sintaxis recursiva).
Por lo tanto, no es porque sea feo o complejo o propenso a errores para analizar HTML usando solo expresiones regulares. Es que simplemente no es posible .
Si necesita analizar un formato que contiene estructuras recursivas, debe al menos complementar el uso de expresiones regulares con una pila para realizar un seguimiento del nivel de las estructuras recursivas. Esto es típicamente cómo funciona un analizador sintáctico. Las expresiones regulares se usan para reconocer las partes "lineales", mientras que el código personalizado fuera de la expresión regular se usa para realizar un seguimiento de las estructuras anidadas.
Por lo general, el análisis como este se divide en fases separadas. La tokenización es la primera fase donde se usan expresiones regulares para dividir la entrada en una secuencia de "tokens" como palabras, puntuación, corchetes, etc. El análisis es la siguiente fase donde estos tokens se analizan en una estructura jerárquica, un árbol de sintaxis.
Entonces, cuando escuche que HTML o C # no se pueden analizar mediante expresiones regulares, tenga en cuenta que las expresiones regulares siguen siendo una parte crítica de los analizadores. Simplemente no puede analizar dicho lenguaje utilizando solo expresiones regulares y ningún código auxiliar.