Pergunta

Existe uma expressão regular para coincidir com o conteúdo dentro de chaves. Por exemplo, com o seguinte:

d = {'key': {'a': [1,2,3]}}

Eu gostaria de corresponder { 'chave': { 'a': [1,2,3]}} e { 'a': [1,2,3] } , mas não { 'chave': { 'a': [1,2,3]}

Foi útil?

Solução

Em expressões regulares clássicos, isso é impossível -. DFAs não pode analisar pares aninhados

Existem maneiras de fazer isso com expressões regulares estendidas, tais como expressões recursiva que são permitidos em alguns motores de regex (como Perl regex), mas eles não são sempre bonita. ( muito php desde que a versão Perl:. /\{(?:[^{}]+|(?R))*\}/ com a opção (?R) ser o jogo recursiva)

Você não precisa necessariamente regex para fazer esse tipo de coisa embora. Você poderia fazê-lo simplesmente por caminhar através da lista e manter uma pilha de chaves abertas (e em que posição eles foram vistos at). Então sempre que você vê uma chave de abertura, você empurra a sua posição na pilha, e sempre que você vê uma chave perto, você estalar a chave de abertura, mais recentemente visto fora da pilha, e utilizar a sua posição mais a posição atual como os limites para um substring que se torna um de seus jogos. Repita até chegar ao fim da cadeia.

Outras dicas

É bastante simples, mas que encontra uma correspondência:)

{'key': {'\w+': \[[\w,]*\w\]}}

As expressões regulares não pode lidar com aninhamento, então não há nenhuma expressão regular que irá funcionar no caso geral.

Se você pode limitar o nível máximo de encadeamento provavelmente você pode construir uma expressão que verifica explicitamente para todos os possíveis níveis de aninhamento. Geralmente você provavelmente melhor fora de usar algum tipo de quadro analisador.

A biblioteca PCRE regex pode fazer isso usando recursão:

/\{(?:[^{}]+|(?R))*\}/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top