Gdy moja RegExp
ma wiele grup przechwytywania, chcę wiedzieć, która grupa wykonała przechwytywanie (lub co najmniej pierwszą/ostatnią taką grupę, jeśli było więcej niż jedno). Jeśli znasz Python, jest to w zasadzie odpowiednik re.MatchObject.lastgroup
. Niektóre kodu do uczynienia go bardziej zrozumiałym:Skutecznie znajdź grupę, która została dopasowana w wyszukiwaniu 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));
}
Drukuje:
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' ]
pokazach result
tablic, które grupy skierowane do schwytania, ale nie widzę sposobu, aby szybko znaleźć dla każdego danego meczu, który grupowej dopasowany bez iteracji przez macierz. Przydaje się to w przypadkach, gdy duże regexy są programowane programowo, a iteracja jest nieefektywna.
Czy brakuje mi czegoś oczywistego, czy nie jest to możliwe?
Nie sądzę, że to możliwe. Ale co dokładnie robisz, gdy staje się to nieefektywne? Może istnieć lepsze rozwiązanie niż duże wyrażenia regularne z dużymi wynikami. – Bergi
@Bergi: Ponownie używam, zobacz długotrwały komentarz do odpowiedzi minitech poniżej. –
Wiem, że to oszustwo, ale możesz użyć 'indexOf', aby uniknąć jawnego powtarzania. Oczywiście, silnik będzie iterować wewnętrznie – user123444555621