Come faccio a dire a RegEx (versione .NET) di ottenere la più piccola corrispondenza valida invece della più grande?
Come faccio a dire a RegEx (versione .NET) di ottenere la più piccola corrispondenza valida invece della più grande?
Risposte:
Per un'espressione regolare come .*
o .+
, aggiungi un punto interrogativo ( .*?
o .+?
) per trovare il minor numero di caratteri possibile. Per abbinare facoltativamente una sezione (?:blah)?
ma senza corrispondere a meno che non sia assolutamente necessario, utilizzare qualcosa come (?:blah){0,1}?
. Per una corrispondenza ripetuta (utilizzando {n,}
o {n,m}
sintassi) aggiungere un punto interrogativo per cercare di abbinare il minor numero possibile (ad esempio {3,}?
o {5,7}?
).
Anche la documentazione sui quantificatori di espressioni regolari può essere utile.
L'operatore non avido, ?
. Così:
.*?
L'operatore non avido non significa la corrispondenza più breve possibile:
abcabk
a.+?k
corrisponderà all'intera stringa (in questo esempio) invece che solo agli ultimi tre segni.
Vorrei invece trovare effettivamente la corrispondenza più piccola possibile.
Questa è l'ultima possibile corrispondenza per " a
" per consentire ancora tutte le corrispondenze k
.
Immagino che l'unico modo per farlo sia usare un'espressione come:
a[^a]+?k
cab
. Se il mio input è caaacab
e lo cerco a.*?b
restituirà la stringa completa invece della corrispondenza breve all'interno. Come cercherò all'indietro da b
?
START[^START]*?END
(dove START e END sono le espressioni regolari dei caratteri di inizio e fine). Significa essenzialmente "corrisponde a qualsiasi cosa, da INIZIO a FINE dove i caratteri intermedi non includono di nuovo INIZIO"
abcabk
ea.+?k
, RegEx corrisponderà all'intera stringa.