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



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow