Em uma expressão regular, quais caracteres precisam ser escapados?

22

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

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?

LanceBaynes
fonte

Respostas:

12

Isso depende da aplicação. No seu exemplo, [deve ser citado como argumento para, grepmas não echo.

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

A citação é usada para remover o significado especial de certos caracteres ou palavras do shell. A citação pode ser usada para preservar o significado literal dos caracteres especiais no próximo parágrafo, impedir que palavras reservadas sejam reconhecidas como tal e impedir a expansão de parâmetros e a substituição de comandos no processamento do documento aqui (consulte o documento aqui).

O pedido deve citar os seguintes caracteres para se representar:

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

e pode ser necessário citar o seguinte em determinadas circunstâncias. Ou seja, esses caracteres podem ser especiais, dependendo das condições descritas em outras partes deste volume do IEEE Std 1003.1-2001:

*   ?   [   #   ˜   =   %

Os vários mecanismos de citação são o caractere de escape, aspas simples e aspas duplas. O documento aqui representa outra forma de citação; veja aqui - documento.

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

Matteo
fonte
8

Cada aplicativo terá seu próprio conjunto de caracteres 'especiais'. O problema que você encontrou grepnão foi com o shell. Para quais caracteres precisam ser citados grep, leia a seção da página de manual em "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 também precisam ser citados:

!^%

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

Arcege
fonte
Em alguns shells com expansão de histórico ( bashincluída), !ainda é expandido entre aspas duplas, apenas aspas simples interromperão sua expansão (ou desativará a opção de shell).
Chris Baixo
]não deve ser citado, [nem sempre. Eu não encontrei nenhuma referência {e}
Matteo
8

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 por uma barra invertida \. Por exemplo, para combinar com [você , você escreve \[. Alternativamente, os caracteres (exceto ^) podem ser escapados colocando-os entre colchetes um a um [[].

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

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

Expressões regulares básicas (BRE)

  • POSIX: expressões regulares regulares
  • Comandos: grep,sed
  • Caracteres especiais: .[\
  • Especial em alguns contextos: *^$
  • Escapar de uma corda: "$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

Expressões regulares estendidas (ERE)

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

grepusa BRE como seu método regex. Há uma boa documentação sobre ele aqui , um resumo geral seria "escapar de qualquer carácter especial ou metacharacter para obter a sua literal, escapar para criar seqüências de escape ( \n, \r, etc.)", embora isso nem sempre é verdade, por exemplo, você tem que escapar (e )obter seu significado especial (referência anterior).

Chris Down
fonte
0

O shell pode transformar a linha de comando antes da execução do comando. O shell e greppode usar aspas para remover o significado especial de alguns caracteres. No entanto, grepe conchas têm 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 grepe é analisado como uma expressão de colchete malformada por grep.

echo '[]' | grep \[]

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

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

Finalmente, nesse caso, as aspas são removidas pelo shell e \[]são transmitidas como argumento para grep, mas, nesse caso específico ¹, \[são interpretadas grepcomo um colchete literal. São necessárias aspas para impedir a interpretação da barra invertida como um caractere especial pelo shell.


¹ especificação POSIX .

Fólkvangr
fonte