Correspondência de colchetes aninhados sem recursão ou grupos de balanceamento
Correspondência de colchetes aninhados usando expressões regulares pode ser um desafio, especialmente em linguagens como Java, onde a recursão e grupos de balanceamento não são suportados. Felizmente, é realmente possível superar essa limitação usando referências futuras.
Correspondência de grupos externos
A seguinte regex [1] corresponde a grupos externos de colchetes sem impor limites de profundidade:
(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)
Aqui, a expressão antecipa a abertura de parênteses, excluindo parênteses de abertura sem correspondência, e captura os parênteses de fechamento correspondentes. As substrings capturadas, embora inúteis, servem como espaços reservados para completar a correspondência.
Correspondência de grupos internos
Para incluir grupos internos, podemos capturar a seguinte expressão [2]:
(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))
Ao adicionar um grupo de captura e ajustando os índices de referência anterior, esta expressão também captura os grupos internos.
Como funciona
O método itera pela string, correspondendo aos próximos parênteses de abertura e fechamento enquanto capturando a string restante em cada caso. Os lookaheads garantem que os parênteses correspondam de maneira equilibrada.
A expressão é construída da seguinte forma:
Componente | Descrição |
---|---|
(?=() | Afirma que '(' precede a análise complexa |
(?: | Início do grupo sem captura para processamento repetido de string |
(?= | Afirme que o próximo '(' segue |
.?((?!.?\1) | Correspondência até o próximo '(' não seguido pelo grupo 1 |
(.)(?!.\2).* | Preencha o grupo 1 com a string, garantindo que outro ')' exista |
) | Afirme que a correspondência ')' é válida |
.?)(?!.?\2) | Afirme que o próximo ')' não seguido pelo grupo 2 existe |
(.*) | Preencha o grupo 2 com a string restante |
) | Afirme que a correspondência ')' é válida |
Consuma um único caractere para continuar a correspondência dentro o grupo | |
) ? | Repita o grupo (no loop interno) |
.*?(?=\ 1) | Correspondência até e incluindo o último '(' encontrado |
1*(?=\2 $) | Correspondência até o último ')' (mas dentro do grupo válido) |
Este método permite uma correspondência eficiente de colchetes aninhados sem a necessidade para grupos de recursão ou balanceamento.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3