Regular Expressions
Insidie di Regex
Ricerca…
Perché il punto (.) Non corrisponde al carattere di nuova riga ("\ n")?
.*
in regex significa fondamentalmente "cattura tutto fino alla fine dell'input".
Quindi, per le stringhe semplici, come hello world
, .*
funziona perfettamente. Ma se hai una stringa che rappresenta, ad esempio, le linee in un file, queste linee saranno separate da un separatore di riga , come \n
(newline) su sistemi Unix e \r\n
(ritorno a capo e newline) su Finestre.
Per impostazione predefinita, nella maggior parte dei motori di regex, .
non combacia con i caratteri di nuova riga, quindi la corrispondenza si arresta alla fine di ogni riga logica . Se si desidera .
per abbinare davvero tutto, incluse le newline, è necessario abilitare la modalità "dot-matches-all" nel motore regex di scelta (ad esempio, aggiungere re.DOTALL
in Python, o /s
in PCRE.
Perché una regex salta alcune parentesi / parentesi di chiusura e le abbina in seguito?
Considera questo esempio:
Andò nel caffè "Dostoevski" e disse: "Buona sera".
Qui abbiamo due serie di citazioni. Supponiamo di voler abbinare entrambi, in modo che la nostra regex corrisponda a "Dostoevski"
e "Good evening."
All'inizio, potresti essere tentato di mantenerlo semplice:
".*" # matches a quote, then any characters until the next quote
Ma non funziona: corrisponde alla prima citazione in "Dostoevski"
e fino alla citazione di chiusura in "Good evening."
, compreso il and said:
parte. Demo Regex101
Perchè è successo?
Ciò accade perché il motore regex, quando incontra .*
, "Mangia" tutto l'input fino alla fine. Quindi, deve corrispondere alla finale "
. Quindi," arretra "dalla fine della partita, lasciando andare il testo abbinato fino a quando il primo "
viene trovato - ed è, ovviamente, l'ultimo "
nella partita , alla fine della parte "Good evening."
.
Come prevenirlo e abbinare esattamente alle prime virgolette?
Usa [^"]*
. Non mangia tutto l'input - solo fino al primo "
, proprio come necessario. Demo Regex101