Correspondência de caracteres especiais com Expressão Regular


10

Digamos que seja muito fácil se eu quiser encontrar algo que contenha letras minúsculas e números com

produzir_texto | grep -E '[0-9a-z]'

Os colchetes são úteis para combinar com um conjunto de caracteres, mas e aqueles que são um pouco especiais?
Se eu quiser, usando colchetes, corresponda a qualquer caractere, exceto um destes: colchete de fechamento ], traço (ou hífen) "-", barras /e \, um sinal de intercalação ^, dois pontos :.
Será que vai ficar assim (eu sei que isso não funciona)?

[^] - / \ ^:]

Respostas:


11

Para combinar um literal ]e um literal -em uma expressão de colchete, você precisará usá-los assim:

[^]/\^:-]

ou, melhor ainda, já que algumas ferramentas exigem que a barra invertida seja escapada :

[^]/\\^:-]

ou seja,
o colchete direito (']') perderá seu significado especial e se representará em uma expressão entre colchetes, se ocorrer primeiro na lista (após um '^' inicial, se houver)
e
o caractere hífen-menos deve ser tratado como ele mesmo se ocorrer primeiro (após um '^' inicial, se houver) ou por último na lista.
Portanto,
se uma expressão entre colchetes especificar '-' e ']', o ']' será colocado primeiro (após o '^', se houver) e o '-' duram dentro da expressão entre colchetes.
As regras para expressões entre colchetes são as mesmas para ERE e BRE .


2
Eu dobraria a barra invertida para estar do lado seguro. É necessário em muitas awkimplementações e, perlpor exemplo.
Stéphane Chazelas

E quanto a "Do sinal de intercalação ao colchete de fechamento"? Como [^-]](este falha)?
iBug 6/17

2
@iBug - certifique-se de que falhe, pois o suporte correto precisa ser o primeiro se você quiser correspondê-lo literalmente. Eu não estou certo que eu chegar ao ponto de que "intervalo" que você menciona como ^é depois ]então [^-]]não funcionaria mesmo se ambos ^e ]foram tratados literalmente (como [b-a]). De qualquer forma, se você quiser corresponder, por exemplo, ;ao colchete de fechamento, poderá usar um intervalo até o caractere anterior ](que é barra invertida) e incluir ]como primeiro caractere na expressão do colchete, por exemplo [];-\\].
31517 don_crissti

@don_crissti What about [[.^.]-[.-.]]? Tenho a sensação de que isso funcionaria. Vamos supor que o código ASCII de ^seja anterior -.
iBug 7/02/17

Tenho uma solução preguiçosa para a minha pergunta. Simplesmente obtenha tudo de especial na classificação de personagens, como[^[.].][.-.]/\^:]
iBug 07/02

7

Estranhamente, talvez você precise ter alguns caracteres em lugares específicos. Você deve ter ]como o primeiro caractere em um conjunto e -o último caractere em um conjunto.

Aqui está um ER que atende aos seus requisitos [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4

1
Não é muito estranho, é apenas necessário ambigüidade evitar
Kevin

1
O segundo [personagem não pertence a ele; o OP não deseja excluí-lo.
575 Scott Scott

@ Scott bem localizado, obrigado. Resposta atualizada.
roaima 14/02
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.