Regular Expressions
Escaping
Ricerca…
Letterali stringa RAW
È meglio per la leggibilità (e il tuo equilibrio mentale) evitare di sfuggire alle fughe. È qui che arrivano i letterali delle stringhe non formattate. (Si noti che alcune lingue consentono i delimitatori, che di solito sono preferiti dalle stringhe. Ma questa è un'altra sezione.)
Di solito funzionano allo stesso modo in cui questa risposta descrive :
[A] backslash,
\
, è inteso come "solo una barra rovesciata" (eccetto quando viene prima di una citazione che altrimenti terminerebbe il letterale) - nessuna "sequenza di escape" per rappresentare newlines, tab, backspaces, form-feeds , e così via.
Non tutte le lingue li hanno e quelli che usano una sintassi variabile. C # li chiama in realtà letterali stringa letterali , ma è la stessa cosa.
Pitone
pattern = r"regex"
pattern = r'regex'
C ++ (11+)
La sintassi qui è estremamente versatile. L'unica regola è usare un delimitatore che non appare da nessuna parte nella regex. Se lo fai, non è necessaria alcuna escaping aggiuntiva per qualcosa nella stringa. Nota che le parentesi ()
non fanno parte della regex:
pattern = R"delimiter(regex)delimiter";
VB.NET
Basta usare una corda normale. I backslash sono SEMPRE letterali .
C #
pattern = @"regex";
Nota che questa sintassi consente anche ""
(due virgolette doppie) come forma di escape di "
.
stringhe
Nella maggior parte dei linguaggi di programmazione, per avere una barra rovesciata in una stringa generata da una stringa letterale, ciascuna barra retroversa deve essere raddoppiata nella stringa letterale. Altrimenti, sarà interpretato come una fuga per il prossimo personaggio.
Sfortunatamente, qualsiasi barra inversa richiesta dalla regex deve essere una barra rovesciata letterale. Questo è il motivo per cui diventa necessario avere "escape escapes" ( \\
) quando le regex vengono generate da stringhe letterali.
Inoltre, è possibile che le virgolette ( "
o '
) nel letterale stringa siano obbligatorie per l'escape, a seconda di quale sia la stringa letterale.In alcune lingue, è possibile utilizzare uno o più virgolette per una stringa (scegliere la più leggibile per sfuggire all'intero string letterale).
In alcune lingue (ad esempio: Java <= 7), le espressioni regolari non possono essere espresse direttamente come valori letterali come /\w/
; devono essere generati da stringhe e normalmente vengono utilizzati letterali stringa, in questo caso "\\w"
. In questi casi, i caratteri letterali come virgolette, backslash, ecc. Devono essere sfuggiti. Il modo più semplice per ottenere ciò può essere utilizzando uno strumento (come RegexPlanet ). Questo strumento specifico è progettato per Java, ma funzionerà per qualsiasi lingua con una sintassi di stringa simile.
Quali personaggi devono essere sfuggiti?
L'escape dei caratteri è ciò che consente a determinati caratteri (riservati dal motore regex di manipolare le ricerche) di essere ricercati letteralmente e trovati nella stringa di input. L'escaping dipende dal contesto, quindi questo esempio non copre l'escape della stringa o del delimitatore .
backslash
Dire che il backslash è il carattere di "fuga" è un po 'fuorviante. Escapes backslash e bring backslash; in realtà attiva o disattiva il metacarattere rispetto allo stato letterale del personaggio di fronte ad esso.
Per poter utilizzare una barra rovesciata letterale in qualsiasi fase di un'espressione regolare, deve essere preceduta da un'altra barra rovesciata.
Escaping (al di fuori delle classi di caratteri)
Ci sono diversi personaggi che devono essere sfuggiti per essere presi alla lettera (almeno fuori dalle classi char):
- Parentesi:
[]
- Parentesi:
()
- Bretelle ricurve:
{}
- Operatori:
*
,+
?
,|
- Ancore:
^
,$
- Altri:
.
,\
- Per utilizzare un carattere letterale
^
all'inizio o un valore letterale$
alla fine di un'espressione regolare, il carattere deve essere sfuggito. - Alcuni sapori usano solo
^
e$
come metacaratteri quando sono rispettivamente all'inizio o alla fine della regex. In quei sapori, non è necessaria alcuna fuga aggiuntiva. Di solito è meglio scappare comunque.
Scappare in classi di personaggi
- È preferibile evitare parentesi quadre (
[
e]
) quando appaiono come valori letterali in una classe char. In determinate condizioni, non è necessario, a seconda del sapore , ma danneggia la leggibilità. - Il segno di omissione,
^
, è un meta personaggio quando viene inserito come primo personaggio in una classe char:[^aeiou]
. Ovunque nella classe char, è solo un personaggio letterale. - Il trattino,
-
, è un meta personaggio, a meno che non sia all'inizio o alla fine di una classe di caratteri. Se il primo carattere nella classe char è un segno di spunta^
, allora sarà un valore letterale se è il secondo carattere nella classe char.
Sfuggire alla sostituzione
Esistono anche regole per la fuga all'interno della sostituzione, ma nessuna delle regole sopra riportate si applica. Gli unici metacaratteri sono $
e \
, almeno quando $
può essere usato per fare riferimento a gruppi di cattura (come $1
per il gruppo 1). Per utilizzare un $
letterale, sfuggirlo: \$5.00
. Allo stesso modo \
: C:\\Program Files\\
.
BRE Eccezioni
Mentre ERE (espressioni regolari estese) rispecchia la tipica sintassi in stile Perl, BRE (espressioni regolari di base) presenta differenze significative in termini di escape:
- C'è una sintassi abbreviata diversa. Tutti i
\d
,\s
,\w
e così via sono spariti. Invece, ha una propria sintassi (che POSIX chiama confusivamente "classi di caratteri"), come[:digit:]
. Questi costrutti devono essere all'interno di una classe di caratteri. - Ci sono pochi metacaratteri (
.
,*
,^
,$
) Che possono essere usati normalmente. TUTTI gli altri metacaratteri devono essere sfuggiti in modo diverso:
Bretelle {}
-
a{1,2}
corrisponde aa{1,2}
. Per far corrispondere aa
oaaa
, usaa\{1,2\}
Parentesi ()
-
(ab)\1
non è valido, poiché non esiste un gruppo di cattura 1. Per risolvere il problema e abbinare l'usoabab
\(ab\)\1
Barra rovesciata
- All'interno delle classi char (che sono chiamate espressioni parentesi in POSIX), la barra retroversa non è un metacarattere (e non ha bisogno di escape).
[\d]
corrisponde a\
od
. - Ovunque, scappa come al solito.
Altro
-
+
e?
sono letterali. Se il motore BRE li supporta come metacaratteri, devono essere sottoposti a escape come\?
e\+
.
/Delimitatori/
Molte lingue permettono che la regex sia racchiusa o delimitata tra un paio di caratteri specifici, in genere la barra in avanti /
.
I delimitatori hanno un impatto sull'escaping: se il delimitatore è /
e la regex deve cercare /
literal, la barra forward deve essere preceduta da caratteri di escape prima che possa essere letterale ( \/
).
Eccessiva leggibilità dei rischi di escape, quindi è importante considerare le opzioni disponibili:
Javascript è univoco perché consente la barra diretta come delimitatore, ma nient'altro (sebbene consenta espressioni regex ).
Perl, ad esempio, consente a quasi tutto di essere un delimitatore. Persino i caratteri arabi:
$str =~ m ش ش
Regole specifiche sono menzionate nella documentazione di Perl .
PCRE consente due tipi di delimitatori: delimitatori corrispondenti e delimitatori in stile parentesi. I delimitatori abbinati utilizzano la coppia di un singolo personaggio, mentre i delimitatori in stile parentesi usano un paio di caratteri che rappresentano una coppia di apertura e chiusura.
- Delimitatori corrispondenti:!
!"#$%&'*+,./:;=?@^_`|~-
- Delimitatori in stile parentesi:
()
,{}
,[]
,<>