RegEx: corrispondenza minima possibile o corrispondenza non gradevole


Risposte:


192

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.


7
Non so, se sono l'unico con questo malinteso, ma è importante notare: sebbene sia vero che l'operatore non avido abbinerà il minor numero di caratteri possibile, potrebbe comunque non essere la corrispondenza che sta cercando per. "Minor numero di caratteri possibile" non equivale a "corrispondenza più breve possibile" per quanto riguarda gli standard RegEx. Vedi la risposta sotto il mio commento: con abcabke a.+?k, RegEx corrisponderà all'intera stringa.
Finefoot

Riga2 "ma senza corrispondenza a meno che non sia assolutamente necessario": cosa significa?
Piove il


45

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


2
Oppure cerca in ordine inverso, iniziando dalla fine, quando le corrispondenze sono nidificate: "(ab (abk) bk)".
LBogaardt

7
@LBogaardt come si cerca in ordine inverso? non
capirlo

2
@LBogaardt Domanda ancora aperta: come si cerca in ordine inverso? Diciamo che voglio ottenere 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?
C4d

3
Inverti la stringa, quindi applica la regex.
Jonathan Allen

3
Questo è molto utile. Per le persone come me che cercano di capire cosa sta succedendo qui, la forma generica è 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"
derekantrican
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.