In un'espressione regolare, quali personaggi devono fuggire?


23

In generale, quali personaggi in un'espressione regolare devono scappare?

Ad esempio, quanto segue non è sintatticamente corretto:

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

Questo, tuttavia, è sintatticamente corretto:

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

Esiste una documentazione su quali caratteri debbano sfuggire a un'espressione regolare e quali no?

Risposte:


12

Questo dipende dall'applicazione. Nel tuo esempio [deve essere citato come argomento per grepma non echo.

Per la shell (dalle specifiche POSIX ):

La citazione viene utilizzata per rimuovere il significato speciale di determinati caratteri o parole dalla shell. Le virgolette possono essere utilizzate per preservare il significato letterale dei caratteri speciali nel paragrafo successivo, impedire che le parole riservate vengano riconosciute come tali e impedire l'espansione dei parametri e la sostituzione dei comandi nell'elaborazione del documento qui (vedere il documento qui).

La domanda deve citare i seguenti caratteri se devono rappresentarsi:

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

e potrebbe essere necessario citare quanto segue in determinate circostanze. Cioè, questi caratteri possono essere speciali a seconda delle condizioni descritte altrove in questo volume di IEEE Std 1003.1-2001:

*   ?   [   #   ˜   =   %

I vari meccanismi di quotazione sono il carattere di escape, virgolette singole e virgolette doppie. Il documento qui rappresenta un'altra forma di citazione; vedi qui-documento.

Programmi specifici (usando regexes, perl, awk) potrebbero avere requisiti aggiuntivi per la fuga.


8

Ogni applicazione avrà il proprio set di caratteri "speciali". Il problema che hai riscontrato grepnon riguardava la shell. Per i personaggi che devono essere citati grep, leggi la sezione della manpage su "ESPRESSIONI REGOLARI".

Per la shell, i caratteri che dovrebbero essere citati sono:

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

e qualsiasi spazio bianco.

A seconda della shell, potrebbe essere necessario citare anche altri personaggi:

!^%

Guarda sotto "SHELL GRAMMAR" sulla manpage della shell.


In alcune shell con espansione della cronologia ( bashinclusa), !viene ancora espansa tra virgolette doppie, solo le virgolette singole ne interromperanno l'espansione (o disattivando l'opzione shell).
Chris Down,

]non dovrebbe essere citato, [non sempre. Non ho trovato alcun riferimento a {e}
Matteo

8

Esistono più tipi di espressioni regolari e l'insieme di caratteri speciali dipende dal tipo particolare. Alcuni di essi sono descritti di seguito. In tutti i casi, i caratteri speciali vengono esclusi da una barra rovesciata \. Ad esempio, per abbinare [si scrive \[invece. In alternativa, è ^possibile sfuggire ai caratteri (tranne ) racchiudendoli tra parentesi quadre uno per uno come [[].

I caratteri che sono speciali in alcuni contesti come ^speciali all'inizio di una (sotto) espressione possono essere sfuggiti in tutti i contesti.

Come altri hanno scritto: nella shell se non racchiudi l'espressione tra virgolette singole, devi anche sfuggire ai caratteri speciali per la shell nella regex già sfuggita. Esempio: Invece di '\['te puoi scrivere \\[(in alternativa: "\["o "\\[") in shell compatibili con Bourne come bash ma questa è un'altra storia.

Espressioni regolari di base (BRE)

  • POSIX: espressioni regolari di base
  • Comandi: grep,sed
  • Personaggi speciali: .[\
  • Speciale in alcuni contesti: *^$
  • Fuga da una stringa: "$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

Espressioni regolari estese (ERE)

  • POSIX: espressioni regolari estese
  • Comandi:, grep -EGNU sed -r:, * BSD:sed -E
  • Personaggi speciali: .[\(
  • Speciale in alcuni contesti: *^$)+?{|
  • Fuga da una stringa: "$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"

3

grepusa BRE come metodo regex. C'è una buona documentazione su di esso qui , una carrellata generale sarebbe "fuga qualsiasi carattere speciale o metacarattere per ottenere la sua letterale, la fuga di creare sequenze di escape ( \n, \r, ecc)", anche se questo non è sempre vero, per esempio, si deve fuggire (e )ottenere il loro significato speciale (backreference).


0

La shell può trasformare la riga di comando prima dell'esecuzione del comando. Sia la shell che le grepcitazioni possono essere utilizzate per rimuovere il significato speciale di alcuni caratteri. Tuttavia, le grepconchiglie hanno diversi caratteri speciali. Inoltre, i caratteri speciali senza escape che non derivano da un'espansione esistente vengono rimossi, prima dell'esecuzione del comando, dalla shell.

echo '[]' | grep '[]'

La shell trasmette l'argomento []a greped è analizzata come espressione di parentesi non valida da grep.

echo '[]' | grep \[]

Sopra, possiamo vedere un caso simile. La barra rovesciata viene rimossa e []viene trasmessa come argomento a grep. grepriconosce un'espressione di parentesi non valida.

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

Infine, in questo caso, le virgolette vengono rimosse dalla shell e \[]vengono trasmesse come argomento grepma, in questo caso specifico ¹, \[vengono interpretate grepcome parentesi letterali. Le virgolette sono necessarie per impedire l'interpretazione della barra rovesciata come carattere speciale da parte della shell.


¹ Specifica POSIX .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.