"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Os colchetes aninhados podem ser combinados sem recursão ou grupos de balanceamento?

Os colchetes aninhados podem ser combinados sem recursão ou grupos de balanceamento?

Publicado em 2024-11-06
Navegar:856

Can Nested Brackets Be Matched Without Recursion or Balancing Groups?

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:

ComponenteDescriçã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.


  1. (
Declaração de lançamento Este artigo foi reimpresso em: 1729740015 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

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