Sfortunatamente, per motivi storici, strumenti diversi hanno una sintassi leggermente diversa dell'espressione regolare e talvolta alcune implementazioni hanno estensioni non supportate da altri strumenti. Sebbene ci sia un terreno comune, sembra che ogni autore di strumenti abbia fatto alcune scelte diverse.
La conseguenza è che se si dispone di un'espressione regolare che funziona in uno strumento, potrebbe essere necessario modificarlo per funzionare in un altro strumento. Le principali differenze tra gli strumenti comuni sono:
- se gli operatori
+?|(){}
richiedono una barra rovesciata;
- quali estensioni sono supportate oltre le basi
.[]*^$
e di solito+?|()
In questa risposta, elenco gli standard principali . Controlla la documentazione degli strumenti che stai utilizzando per i dettagli.
Il confronto di Wikipedia con i motori delle espressioni regolari ha una tabella che elenca le funzionalità supportate da implementazioni comuni.
Le espressioni regolari di base sono codificate dallo standard POSIX . È la sintassi utilizzata da grep
, sed
e vi
. Questa sintassi fornisce le seguenti funzionalità:
^
e $
corrispondono solo all'inizio e alla fine di una riga.
.
corrisponde a qualsiasi personaggio (o qualsiasi personaggio tranne una nuova riga).
[…]
corrisponde a qualsiasi carattere elencato tra parentesi (set di caratteri). Se il primo carattere dopo la parentesi quadra aperta è a ^
, i caratteri che non sono elencati sono invece corrispondenti. Per includere a ]
, inseriscilo subito dopo l'apertura [
(o dopo [^
se si tratta di un set negativo). Se -
è compreso tra due caratteri, indica un intervallo; per includere un valore letterale -
, mettilo dove non può essere analizzato come intervallo.
- Barra rovesciata prima di una qualsiasi delle
^$.*\[
virgolette del carattere successivo.
*
corrisponde al carattere precedente o alla sottoespressione 0, 1 o più volte.
\(…\)
è un gruppo sintattico, da utilizzare con l' *
operatore o backreferenze e \DIGIT
sostituzioni.
- Backreference
\1
, \2
, ... corrispondono al testo esatto corrispondente al gruppo corrispondente, ad esempio, \(fo*\)\(ba*\)\1
le partite foobaafoo
ma non foobaafo
. Non esiste un modo standard per fare riferimento al decimo gruppo e oltre (il significato standard di \10
è il primo gruppo seguito da a 0
).
Le seguenti funzionalità sono anche standard, ma mancano in alcune implementazioni limitate:
\{m,n\}
corrisponde al carattere o alla sottoespressione precedente tra m e n volte; n o m possono essere omessi e significa esattamente m .\{m\}
- Tra parentesi, è possibile utilizzare le classi di caratteri , ad esempio
[[:alpha:]]
corrisponde a qualsiasi lettera. Le implementazioni moderne delle espressioni parentesi quadre includono anche elementi di confronto simili [.ll.]
e classi di equivalenza simili [=a=]
.
Le seguenti sono estensioni comuni (specialmente negli strumenti GNU), ma non si trovano in tutte le implementazioni. Controlla il manuale dello strumento che stai utilizzando.
\|
in alternanza: foo\|bar
partite foo
o bar
.
\?
(abbreviazione di \{0,1\}
) e \+
(abbreviazione di \{1,\}
) corrispondono al carattere precedente o alla sottoespressione al massimo 1 volta o almeno 1 volta rispettivamente.
\n
corrisponde a una nuova riga, \t
corrisponde a una scheda, ecc.
\w
corrisponde a qualsiasi parola costituente (abbreviazione di [_[:alnum:]]
ma con variazione quando si tratta di localizzazione) e \W
corrisponde a qualsiasi carattere che non sia una parola costituente.
\<
e \>
abbina la stringa vuota solo all'inizio o alla fine di una parola rispettivamente; \b
corrisponde e \B
corrisponde a dove \b
no.
Si noti che gli strumenti senza l' \|
operatore non hanno la piena potenza delle espressioni regolari. Le backreferenze consentono alcune cose extra che non possono essere fatte con espressioni regolari in senso matematico.
Le espressioni regolari estese sono codificate dallo standard POSIX . Il loro principale vantaggio rispetto a BRE è la regolarità: tutti gli operatori standard sono caratteri di punteggiatura nudi, una barra rovesciata prima che un carattere di punteggiatura lo citi sempre. È la sintassi usata da awk
, grep -E
o egrep
, GNU sed -r
, e dall'operatore di bash=~
. Questa sintassi fornisce le seguenti funzionalità:
^
e $
corrispondono solo all'inizio e alla fine di una riga.
.
corrisponde a qualsiasi personaggio (o qualsiasi personaggio tranne una nuova riga).
[…]
corrisponde a qualsiasi carattere elencato tra parentesi (set di caratteri). Il completamento con un'iniziale ^
e gli intervalli funzionano come in BRE (vedi sopra). Le classi di caratteri possono essere utilizzate ma mancano in alcune implementazioni. Le implementazioni moderne supportano anche classi di equivalenza ed elementi di confronto. Una barra rovesciata tra parentesi cita il carattere successivo in alcune ma non in tutte le implementazioni; usare \\
per indicare una barra rovesciata per la portabilità.
(…)
è un gruppo sintattico, da utilizzare *
o \DIGIT
sostituire.
|
in alternanza: foo|bar
partite foo
o bar
.
*
, +
E ?
corrisponde al carattere precedente o sotto-espressione di un certo numero di volte: 0 o più per *
, 1 o più per +
, 0 o 1 per ?
.
- La barra rovesciata cita il carattere successivo se non è alfanumerico.
{m,n}
corrisponde al carattere precedente o sottoespressione tra m ed n volte (mancanti alcune implementazioni); n o m possono essere omessi e significa esattamente m .{m}
- Alcune estensioni comuni come in BRE: backreferences (in particolare assenti in awk tranne nell'implementazione di busybox in cui è possibile utilizzare ); caratteri speciali , ecc .; confini di parole e , costituenti di parole e , ...
\DIGIT
$0 ~ "(...)\\1"
\n
\t
\b
\B
\b
\B
PCRE (espressioni regolari compatibili con Perl)
PCRE sono estensioni di ERE, originariamente introdotte da Perl e adottate da GNU grep -P
e da molti strumenti e linguaggi di programmazione moderni , generalmente tramite la libreria PCRE . Consulta la documentazione di Perl per una buona formattazione con esempi. PCRE non supporta tutte le funzionalità dell'ultima versione di Perl (ad es. L'esecuzione del codice Perl è supportata solo in Perl). Consultare il manuale PCRE per un riepilogo delle funzioni supportate. Le principali aggiunte a ERE sono:
(?:…)
è un gruppo che non cattura: mi piace (…)
, ma non conta per i riferimenti indietro.
(?=FOO)BAR
(lookahead) corrisponde BAR
, ma solo se esiste anche una corrispondenza per FOO
iniziare nella stessa posizione. Questo è molto utile per ancorare una corrispondenza senza includere il seguente testo nella corrispondenza: foo(?=bar)
corrispondenze foo
ma solo se è seguita da bar
.
(?!FOO)BAR
(lookahead negativo) corrisponde BAR
, ma non esiste anche una corrispondenza FOO
nella stessa posizione. Ad esempio, (?!foo)[a-z]+
corrisponde a qualsiasi parola minuscola che non inizia con foo
; [a-z]+(?![0-9)
corrisponde a qualsiasi parola minuscola che non è seguita da una cifra (quindi in foo123
, corrisponde fo
ma non foo
).
(?<=FOO)BAR
(lookbehind) corrisponde BAR
, ma solo se è immediatamente preceduto da una corrispondenza per FOO
. FOO
deve avere una lunghezza nota (non è possibile utilizzare operatori di ripetizione come *
). Questo è molto utile per ancorare una corrispondenza senza includere il testo precedente nella corrispondenza: (?<=^| )foo
corrispondenze, foo
ma solo se è preceduto da uno spazio o dall'inizio della stringa.
(?<!FOO)BAR
(lookbehind negativo) corrisponde BAR
, ma solo se non è immediatamente preceduto da una corrispondenza per FOO
. FOO
deve avere una lunghezza nota (non è possibile utilizzare operatori di ripetizione come *
). Questo è molto utile per ancorare una corrispondenza senza includere il testo precedente nella corrispondenza: (?<![a-z])foo
corrispondenze foo
ma solo se non è preceduta da una lettera minuscola.
Emacs
La sintassi di Emacs è intermedia tra BRE ed ERE. Oltre a Emacs, è la sintassi predefinita per -regex
in GNU find. Emacs offre i seguenti operatori:
^
, $
, .
, […]
, *
, +
, ?
Come in ERE
\(…\)
, \|
, \{…\}
, Come in BRE\DIGIT
- più sequenze di lettere rovesciate ;
\<
e \>
per i confini delle parole; e altro nelle ultime versioni di Emacs, che spesso non sono supportate in altri motori con una sintassi simile a Emacs.
I globs di shell (caratteri jolly) eseguono la corrispondenza dei motivi con una sintassi completamente diversa dalle espressioni regolari e meno potente. Oltre alle shell, questi caratteri jolly sono disponibili con altri strumenti come i find -name
filtri e rsync. I modelli POSIX includono le seguenti funzionalità:
?
corrisponde a qualsiasi singolo personaggio.
[…]
è un set di caratteri come nelle comuni sintassi delle espressioni regolari. Alcune shell non supportano le classi di caratteri. Alcune shell richiedono !
invece di ^
negare il set.
*
corrisponde a qualsiasi sequenza di caratteri (spesso tranne /
quando si corrispondono percorsi di file; se /
è escluso *
, a **
volte include /
, ma controllare la documentazione dello strumento).
- La barra rovesciata cita il carattere successivo.
Ksh offre funzionalità aggiuntive che conferiscono al suo modello la piena potenza delle espressioni regolari. Queste funzionalità sono disponibili anche in bash dopo l'esecuzione shopt -s extglob
. Zsh ha una sintassi diversa ma può anche supportare la sintassi di ksh dopo setopt ksh_glob
.
vim
libast AT & T (come inksh93
).