Quando il mio RegExp
ha un numero di gruppi di acquisizione, voglio sapere quale gruppo ha effettuato l'acquisizione (o almeno il primo/ultimo gruppo di questo tipo, se ce ne fossero più di uno). Se hai familiarità con Python, questo è fondamentalmente l'equivalente di re.MatchObject.lastgroup
. Alcuni codice per renderlo più chiaro:Trovare in modo efficiente il gruppo corrispondente in una ricerca RegExp
var re_captures = new RegExp("(\\d+)|(for)|(\\w+)", "g");
var str = " for me 20 boxes please";
var result;
while ((result = re_captures.exec(str)) !== null) {
console.log(result[0], 'at', result.index, result.slice(1));
}
Esso stampa:
for at 1 [ undefined, 'for', undefined ]
me at 5 [ undefined, undefined, 'me' ]
20 at 8 [ '20', undefined, undefined ]
boxes at 11 [ undefined, undefined, 'boxes' ]
please at 17 [ undefined, undefined, 'please' ]
Gli spettacoli result
matrice che i gruppi hanno fatto una cattura, ma non vedo alcun modo per trovare rapidamente fuori per ogni data partita, quale gruppo abbinato a senza iterare attraverso l'array. Ciò risulta utile nei casi in cui le regex di grandi dimensioni vengono create a livello di codice e l'iterazione è inefficiente.
Mi manca qualcosa di ovvio, o non è possibile?
Non credo sia possibile. Ma cosa stai facendo esattamente quando questo diventa inefficiente? Potrebbe esserci una soluzione migliore rispetto alle regex di grandi dimensioni con grandi risultati. – Bergi
@Bergi: re il mio uso, vedere il lungo commento che ho fatto alla risposta di minitech qui sotto. –
So che questo è imbroglio, ma puoi usare 'indexOf' per evitare esplicitamente iteraring. Certo, il motore verrà iterato internamente – user123444555621