Regular Expressions
Modificatori del Regex (bandiere)
Ricerca…
introduzione
I modelli di espressioni regolari sono spesso usati con i modificatori (chiamati anche flag ) che ridefiniscono il comportamento regex. I modificatori del Regex possono essere regolari (ad esempio /abc/i
) e in linea (o incorporati ) (ad esempio (?i)abc
). I modificatori più comuni sono i modificatori globali, maiuscole e minuscole, multilinea e dotall. Tuttavia, le espressioni regex differiscono nel numero di modificatori di espressioni regolari supportati e nei loro tipi.
Osservazioni
Modificatori PCRE
Modificatore | In linea | Descrizione |
---|---|---|
PCRE_CASELESS | (?io) | Partita insensibile al maiuscolo / minuscolo |
PCRE_MULTILINE | (? M) | Corrispondenza di più righe |
PCRE_DOTALL | (?S) | . corrisponde alle nuove linee |
PCRE_ANCHORED | (?UN) | Meta-carattere ^ corrisponde solo all'inizio |
PCRE_EXTENDED | (?X) | Gli spazi bianchi vengono ignorati |
PCRE_DOLLAR_ENDONLY | n / A | Meta-character $ corrisponde solo alla fine |
PCRE_EXTRA | (?X) | Strict escape parsing |
PCRE_UTF8 | Gestisce i caratteri UTF-8 | |
PCRE_UTF16 | Gestisce i caratteri UTF-16 | |
PCRE_UTF32 | Gestisce caratteri UTF-32 | |
PCRE_UNGREEDY | (? U) | Imposta il motore su una corrispondenza lenta |
PCRE_NO_AUTO_CAPTURE | (? :) | Disabilita i gruppi di cattura automatica |
Modificatori di Java
Modificatore ( Pattern.### ) | Valore | Descrizione |
---|---|---|
UNIX_LINES | 1 | Abilita la modalità linee Unix . |
CASE_INSENSITIVE | 2 | Abilita la corrispondenza senza distinzione tra maiuscole e minuscole. |
COMMENTI | 4 | Permette spazi bianchi e commenti in uno schema. |
MULTILINE | 8 | Abilita la modalità multilinea. |
LETTERALE | 16 | Abilita l'analisi letterale del pattern. |
DOTALL | 32 | Abilita la modalità dotall. |
UNICODE_CASE | 64 | Abilita la piegatura del caso con riconoscimento Unicode. |
CANON_EQ | 128 | Abilita l'equivalenza canonica. |
UNICODE_CHARACTER_CLASS | 256 | Abilita la versione Unicode delle classi di caratteri predefinite e delle classi di caratteri POSIX. |
Modificatore DOTALL
Un modello regex in cui un modificatore DOTALL (nella maggior parte delle espressioni regex espresso con s
) modifica il comportamento di .
abilitandolo per abbinare un simbolo di nuova riga (LF):
/cat (.*?) dog/s
Questa espressione regolare in stile Perl corrisponderà a una stringa come "cat fled from\na dog"
catturata "fled from\na"
nel Gruppo 1.
Una versione in linea: (?s)
(es. (?s)cat (.*?) dog
)
Nota : in Ruby, l'equivalente del modificatore DOTALL è m
, Regexp::MULTILINE
modificatore Regexp::MULTILINE
(es. /a.*b/m
).
Nota : JavaScript non fornisce un modificatore DOTALL, quindi a .
non può mai permettersi di abbinare un carattere di nuova riga. Per ottenere lo stesso effetto, è necessaria una soluzione alternativa, ad esempio la sostituzione di tutto il .
s con una classe di caratteri catch-all come [\S\s]
, o una classe di caratteri non nulla [^]
(tuttavia, questo costrutto sarà trattato come un errore da tutti gli altri motori, e quindi non è portatile).
Modificatore MULTILINE
Un altro esempio è un modificatore MULTILINE (solitamente espresso con m
flag (non in Oniguruma (es. Ruby) che usa m
per denotare un modificatore DOTALL)) che rende ^
e $
anchor corrispondenti all'inizio / fine di una riga , non all'inizio / fine dell'intera stringa.
/^My Line \d+$/gm
troverà tutte le linee che iniziano con My Line
, quindi contengono uno spazio e 1 o più cifre fino alla fine della riga.
Una versione inline: (?m)
(es. (?m)^My Line \d+$
)
NOTA : In Oniguruma (ad esempio in Ruby), e anche in quasi tutti gli editor di testo che supportano le espressioni regolari, le ancore ^
e $
indicano le posizioni iniziali / finali della linea per impostazione predefinita . È necessario utilizzare \A
per definire l'intero documento / inizio stringa e \z
per indicare il fine documento / stringa. La differenza tra \Z
e \z
è che il primo può corrispondere prima del simbolo finale di fine riga (LF) alla fine della stringa (ad esempio /\Astring\Z/
troverà una corrispondenza in "string\n"
) (eccetto Python, dove il comportamento di \Z
è uguale a \z
e \z
ancora non è supportato).
Modificatore IGNORE CASE
Il modificatore comune per ignorare il caso è i
:
/fog/i
foG
Fog
, foG
, ecc.
La versione in linea del modificatore appare come (?i)
.
Gli appunti:
In Java, per impostazione predefinita, la corrispondenza senza distinzione tra maiuscole e minuscole presuppone che vengano confrontati solo i caratteri nel set di caratteri US-ASCII. La corrispondenza senza distinzione tra maiuscole e minuscole di Unicode può essere abilitata specificando il flag UNICODE_CASE
in combinazione con questo flag ( CASE_INSENSITIVE
) . (ad es. Pattern p = Pattern.compile("YOUR_REGEX", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
). Altre informazioni su questo argomento sono disponibili in corrispondenza di Case-Insensitive Matching in Java RegEx . Inoltre, UNICODE_CHARACTER_CLASS
può essere utilizzato per rendere compatibile Unicode corrispondente.
Modificatore VERBOSE / COMMENT / IgnorePatternWhitespace
Il modificatore che consente di utilizzare gli spazi bianchi all'interno di alcune parti del pattern per formattarlo per una migliore leggibilità e per consentire commenti che iniziano con #
:
/(?x)^ # start of string
(?=\D*\d) # the string should contain at least 1 digit
(?!\d+$) # the string cannot consist of digits only
\# # the string starts with a hash symbol
[a-zA-Z0-9]+ # the string should have 1 or more alphanumeric symbols
$ # end of string
/
Esempio di una stringa: #word1here
. Nota: il simbolo #
viene fatto scorrere per indicare un #
letterale che fa parte di un modello.
Lo spazio bianco senza escape nel pattern di espressione regolare viene ignorato, sfuggirlo per renderlo parte del pattern.
Di solito, lo spazio bianco all'interno delle classi di caratteri ( [...]
) viene trattato come uno spazio bianco letterale, tranne in Java.
Inoltre, vale la pena ricordare che in PCRE, .NET, Python, Ruby Oniguruma, ICU, Boost regex flavor si possono usare (?#:...)
commenti all'interno del pattern regex.
Modificatore di cattura esplicita
Questo è un modificatore specifico regex .NET espresso con n
. Quando vengono utilizzati, i gruppi senza nome (come (\d+)
) non vengono catturati. Solo le catture valide sono gruppi con nome esplicito (ad es. (?<name> subexpression)
).
(?n)(\d+)-(\w+)-(?<id>\w+)
corrisponderà all'intero 123-1_abc-00098
, ma (\d+)
e (\w+)
non creeranno gruppi nell'oggetto match risultante. L'unico gruppo sarà ${id}
. Guarda la demo .
Modificatore UNICODE
Il modificatore UNICODE, solitamente espresso come u
(PHP, Python) o U
(Java), rende il motore regex che tratta il pattern e la stringa di input come stringhe e pattern Unicode, crea le classi stenografiche del pattern come \w
, \d
, \s
, ecc. A conoscenza di Unicode.
/\A\p{L}+\z/u
è un'espressione regolare di PHP per far corrispondere le stringhe costituite da 1 o più lettere Unicode. Guarda la demo regex .
Nota che in PHP , il modificatore /u
consente al motore PCRE di gestire le stringhe come stringhe UTF8 ( PCRE_UTF8
verbo PCRE_UTF8
) e rendere le classi di caratteri abbreviati nel pattern Unicode consapevole (abilitando il verbo PCRE_UCP
, vedere più su pcre.org ) .
Le stringhe di soggetto e modello sono considerate UTF-8. Questo modificatore è disponibile da PHP 4.1.0 o versioni successive su Unix e da PHP 4.2.3 su Win32. La validità del pattern UTF-8 e il soggetto sono controllati da PHP 4.3.5. Un oggetto non valido farà sì che la funzione preg_ * non corrisponda a nulla; un pattern non valido attiverà un errore di livello E_WARNING. Le sequenze UTF-8 di cinque e sei ottetti sono considerate non valide da PHP 5.3.4 (PCRE 7.3 2007-08-28); in precedenza quelli erano considerati UTF-8 validi.
In Python 2.x, re.UNICODE
influenza solo il pattern stesso: re.UNICODE
\w
, \W
, \b
, \B
, \d
, \D
, \s
e \S
dipendenti dal database delle proprietà dei caratteri Unicode.
Una versione inline: (?u)
in Python, (?U)
in Java. Per esempio:
print(re.findall(ur"(?u)\w+", u"Dąb")) # [u'D\u0105b']
print(re.findall(r"\w+", u"Dąb")) # [u'D', u'b']
System.out.println("Dąb".matches("(?U)\\w+")); // true
System.out.println("Dąb".matches("\\w+")); // false
Modificatore PCRE_DOLLAR_ENDONLY
Il modificatore PCRE_DOLLAR_ENDONLY compatibile PCRE che rende l'ancora $
match alla fine della stringa (esclusa la posizione prima della riga finale finale nella stringa).
/^\d+$/D
è uguale a
/^\d+\z/
e corrisponde a un'intera stringa composta da 1 o più cifre e non corrisponde a "123\n"
, ma corrisponde a "123"
.
Modificatore PCRE_ANCHORED
Un altro modificatore compatibile con PCRE espresso con il modificatore /A
Se questo modificatore è impostato, il pattern è forzato ad essere "ancorato", cioè, è costretto a corrispondere solo all'inizio della stringa che viene cercata (la "stringa soggetto"). Questo effetto può anche essere ottenuto mediante costrutti appropriati nel pattern stesso, che è l'unico modo per farlo in Perl.
/man/A
equivale a
/^man/
Modificatore PCRE_UNGREEDY
La bandiera PCRE_UNGREEDY conforme a PCRE espressa con /U
/a.*?b/U
avidità all'interno di un pattern: /a.*?b/U
= /a.*b/
e viceversa.
Modificatore PCRE_INFO_JCHANGED
Un altro modificatore PCRE che consente l'utilizzo di gruppi duplicati denominati.
NOTA : è supportata solo la versione inline - (?J)
e deve essere posizionata all'inizio del pattern.
Se usi
/(?J)\w+-(?:new-(?<val>\w+)|\d+-empty-(?<val>[^-]+)-collection)/
i valori del gruppo "val" non saranno mai vuoti (sarà sempre impostato). Un effetto simile può essere ottenuto con il reset del ramo.
Modificatore PCRE_EXTRA
Un modificatore PCRE che causa un errore se una barra rovesciata in un pattern è seguita da una lettera che non ha un significato speciale. Per impostazione predefinita, una barra rovesciata seguita da una lettera senza significato speciale viene considerata letterale.
Per esempio
/big\y/
corrisponderà bigy
, ma
/big\y/X
genererà un'eccezione.
Versione in linea: (?X)