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 è caaacabe lo cerco a.*?brestituirà 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"
abcabkea.+?k, RegEx corrisponderà all'intera stringa.