Ho fatto un semplice codice per l'acquisizione di un certo gruppo in una stringa:Regex in Javascript non è così goloso come dovrebbe?
/[a-z]+([0-9]+)[a-z]+/gi (n chars , m digts , k chars).
code:
var myString='aaa111bbb222ccc333ddd';
var myRegexp=/[a-z]+([0-9]+)[a-z]+/gi;
var match=myRegexp.exec(myString);
console.log(match)
while (match != null)
{
match = myRegexp.exec(myString);
console.log(match)
}
Il risultato sono stati:
["aaa111bbb", "111"]
["ccc333ddd", "333"]
null
Ma aspettate un minuto, Perché non ha provato la parte bbb222ccc
?
Voglio dire, ha visto la aaa111bbb
ma poi si dovrebbe avere provare il bbb222ccc
... (Questo è goloso!)
Che cosa mi manca?
anche
guardando
while (match != null)
{
match = myRegexp.exec(myString);
console.log(match)
}
come si è progredito al secondo risultato? all'inizio c'era:
var match = myRegexp.exec (myString);
più tardi (in un ciclo while)
match=myRegexp.exec(myString);
match=myRegexp.exec(myString);
è la stessa linea ... dove va a ricordare che il risultato prima era già mostrato?
Poiché l'indice dopo la prima partita è alla fine della prima partita del bbb era già passato e nulla è lasciato per abbinare tranne il resto della stringa che è '" ccc333ddd "'. Greedy significa che '+' cercherà di abbinare il più possibile senza tener conto che la prossima parte della regex potrebbe farcela. – Esailija
ciao @Esailija sì, l'ho già capito. ma se è avido come si dice, non lo è. –
@Esailija si prega di incollare il tuo commento come risposta. –