Regular Expressions Perché una regex salta alcune parentesi / parentesi di chiusura e le abbina in seguito?


Esempio

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