Regex para matchng qualquer coisa entre parênteses

0

Eu tenho o seguinte regex até agora:

printf "this is (test.com)\n" | grep -Po '(?<=\().*(?=\))'

O regex acima irá imprimir a saída desejada, que é test.com

Desde que eu esteja adicionando novos parênteses ao meu código

printf "this is (test.com) and (alex)\n" | grep -Po '(?<=\().*(?=\))'

, exibe algo como:

test.com) e (alex

Eu gostaria que meu regex imprimisse qualquer coisa entre colchetes (não importa quantos fossem). Mais, gostaria de adicionar uma condição para imprimir apenas palavras entre colchetes com um tamanho específico.

Por exemplo: (aaa) test1 (bbb) teste de teste (ccc) teste (exemplo) (ddd)

Eu só quero imprimir as palavras entre colchetes que tenham comprimento 3. Então, a saída deve ser:

aaa bbb ccc ddd

    
por яүυк 11.02.2015 / 21:49

1 resposta

1

Por favor, note que a expressão tenta escolher o padrão de correspondência máximo comprimento ( gready regex ). Como você vê no seu exemplo (regex: símbolos entre parênteses), escolhai

  • ... é ( test.com) e (alex )

em vez de

  • ... é ( test.com ) e ( alex ) .

Existem duas maneiras de substituir esse comportamento:

  1. Substitua any symbol por revers match do limite ou deduza o símbolo (por exemplo: (.*) por ([^)]*)
  2. Expressões regulares modernas (PCRE, por exemplo) permitem que um quantificador seja especificado como preguiçoso . Eles colocam um ponto de interrogação após o quantificador para torná-lo preguiçoso .*? . Usando um quantificador lento, a expressão tenta a correspondência mínima primeiro.

Mais da primeira variante permite simplificar a regex: grep -Po '\(\K[^)]*'

    
por 11.02.2015 / 22:27