Em uma expressão regular, quais caracteres precisam escapar?

18

Em geral, quais caracteres em uma expressão regular precisam escapar?

Por exemplo, o seguinte não está sintaticamente correto:

echo '[]' | grep '[]'
grep: Unmatched [ or [^

Isso, no entanto, é sintaticamente correto:

echo '[]' | grep '\[]'
[]

Existe alguma documentação sobre quais caracteres devem ser escapados em uma expressão regular, e quais não devem?

    
por LanceBaynes 15.09.2011 / 20:25

5 respostas

10

Isso depende do aplicativo. No seu exemplo [ deve ser citado como um argumento para grep , mas não echo .

Para o shell (das especificações POSIX ):

Quoting is used to remove the special meaning of certain characters or words to the shell. Quoting can be used to preserve the literal meaning of the special characters in the next paragraph, prevent reserved words from being recognized as such, and prevent parameter expansion and command substitution within here-document processing (see Here-Document).

The application shall quote the following characters if they are to represent themselves:

|  &  ;  <  >  (  )  $  '  \  "  '  <space>  <tab>  <newline>

and the following may need to be quoted under certain circumstances. That is, these characters may be special depending on conditions described elsewhere in this volume of IEEE Std 1003.1-2001:

*   ?   [   #   ˜   =   %

The various quoting mechanisms are the escape character, single-quotes, and double-quotes. The here-document represents another form of quoting; see Here-Document.

Programas específicos (usando regexes, perl, awk) podem ter requisitos adicionais sobre escape.

    
por 15.09.2011 / 20:55
7

Cada aplicativo terá seu próprio conjunto de caracteres "especiais". O problema que você encontrou foi com grep não o shell. Para quais caracteres precisam ser citados em grep , leia a seção do manpage sobre "EXPRESSÕES REGULARES".

Para o shell, os caracteres que devem ser citados são:

;'"'#$&*?[]<>{}\

e qualquer espaço em branco.

Dependendo do shell, outros caracteres podem precisar ser citados também:

!^%

Procure em "SHELL GRAMMAR" na página do shell.

    
por 15.09.2011 / 20:43
5

Existem vários tipos de expressões regulares e o conjunto de caracteres especiais depende do tipo específico. Alguns deles são descritos abaixo. Em todos os casos, caracteres especiais são escapados pelo backslash \ . Por exemplo. para corresponder a [ que você escreve \[ . Alternativamente, os caracteres (exceto ^ ) poderiam ser escapados colocando-os entre colchetes um por um como [[] .

Os caracteres especiais em alguns contextos como ^ special no início de uma (sub) expressão podem ser ignorados em todos os contextos.

Como outros escreveram: no shell, se você não colocar a expressão entre aspas simples, terá que escapar adicionalmente dos caracteres especiais para o shell no regex já escapado. Exemplo: Em vez de '\[' , você pode escrever \[ (alternativamente: "\[" ou "\[" ) em shells compatíveis com Bourne como bash, mas essa é outra história.

Expressões regulares básicas (BRE)

Expressões regulares estendidas (ERE)

  • POSIX: expressões regulares estendidas
  • Comandos: grep -E , GNU: sed -r , * BSD: sed -E
  • Caracteres especiais: .[\(
  • Especial em alguns contextos: *^$)+?{|
  • Escape de uma string: "$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\&/g')"
por 15.06.2015 / 10:46
3

grep usa o BRE como método regex. Há uma boa documentação sobre isso aqui , um resumo geral seria "escapar de qualquer caractere especial ou metacaracteres para obter seu literal, escape para criar seqüências de escape ( \n , \r , etc) ", embora isso nem sempre seja verdade, por exemplo, você tem que escapar ( e ) para obter seu especial significado (backreference).

    
por 15.09.2011 / 20:35
0

O shell pode transformar a linha de comando antes da execução do comando. O shell e o grep podem usar aspas para remover o significado especial de alguns caracteres. No entanto, grep e shells possuem diferentes caracteres especiais. Além disso, caracteres especiais sem escape que não resultaram de uma expansão existente são removidos, antes da execução do comando, pelo shell.

echo '[]' | grep '[]'

O shell transmite o argumento [] para grep e é analisado como uma expressão de colchete malformada em grep .

echo '[]' | grep \[]

Acima, podemos ver um caso semelhante. A barra invertida é removida e [] é transmitido como argumento para grep . grep reconhece uma expressão de colchetes malformada.

echo '[]' | grep '\[]'

Finalmente, neste caso, as aspas são removidas pelo shell e \[] é transmitido como argumento para grep , mas, neste caso específico ¹, \[ é interpretado por grep como um colchete literal. As cotações são necessárias para impedir a interpretação da barra invertida como um caractere especial pelo shell.

¹ especificação POSIX .

    
por 11.07.2018 / 10:03