Expressões regulares não podem identificar estruturas recursivas . Essa é a limitação fundamental.
Pegue o JSON - é um formato bastante simples, mas como um objeto pode conter outros objetos como valores de membros (arbitrariamente profundos), a sintaxe é recursiva e não pode ser analisada por uma regex. Por outro lado, o CSV pode ser analisado por expressões regulares, uma vez que não contém estruturas recursivas.
Em resumo, expressões regulares não permitem que o padrão se refira a si próprio. Você não pode dizer: neste ponto da sintaxe, corresponda a todo o padrão novamente. Dito de outra forma, as expressões regulares correspondem apenas linearmente, não contém uma pilha que permita acompanhar a profundidade de um padrão aninhado.
Observe que não tem nada a ver com a complexidade ou complexidade do formato. As expressões S são realmente muito simples, mas não podem ser analisadas com uma regex. CSS2, por outro lado, é uma linguagem bastante complexa, mas não contém estruturas recursivas e, portanto, pode ser analisada com um regex. (Embora isso não seja verdade para CSS3 devido a expressões CSS, que possuem uma sintaxe recursiva.)
Portanto, não é porque é feio ou complexo ou propenso a erros analisar o HTML usando apenas regex. É que simplesmente não é possível .
Se você precisar analisar um formato que contenha estruturas recursivas, precisará pelo menos complementar o uso de expressões regulares com uma pilha para acompanhar o nível de estruturas recursivas. Normalmente, é assim que um analisador funciona. Expressões regulares são usadas para reconhecer as partes "lineares", enquanto o código personalizado fora da regex é usado para acompanhar as estruturas aninhadas.
Normalmente, a análise como essa é dividida em fases separadas. Tokenização é a primeira fase em que expressões regulares são usadas para dividir a entrada em uma sequência de "tokens", como palavras, pontuação, colchetes, etc. A análise é a próxima fase em que esses tokens são analisados em uma estrutura hierárquica, uma árvore de sintaxe.
Portanto, quando você ouvir que HTML ou C # não podem ser analisados por expressões regulares, lembre-se de que expressões regulares ainda são uma parte crítica dos analisadores. Você simplesmente não pode analisar esse idioma usando apenas expressões regulares e nenhum código auxiliar.