W Chrome 73 wprowadzono metodę String.prototype.matchAll()
. Zachowuje się
podobnie jak match()
, ale zwraca iterator ze wszystkimi wyrażeniami regularnymi
dopasowania do globalnego lub przyklejonego wyrażenia regularnego. Zapewnia to prosty sposób
powielaj dopasowania, szczególnie wtedy, gdy potrzebujesz dostępu do przechwytywania grup.
Co jest nie tak z funkcją match()?
Krótka odpowiedź to nic, chyba że próbujesz zwrócić globalne dopasowania grup przechwytywania. Oto łamigłówka dla Ciebie. Weź pod uwagę te kwestie kod:
const regex = /t(e)(st(\d?))/g;
const string = 'test1test2';
const results = string.match(regex);
console.log(results);
// → ['test1', 'test2']
Uruchom je w konsoli i zauważ, że zwraca ono tablicę zawierającą
ciągi 'test1'
i 'test2'
. Jeśli usunę flagę g ze standardowego
zawiera wszystkie moje grupy przechwytywania, ale widzę tylko pierwszą
dopasowania. Wygląda on następująco:
['test1', 'e', 'st1', '2', index: 0, input: 'test1test2', groups: undefined]
Ten ciąg zawiera drugie możliwe dopasowanie rozpoczynające się od 'test2'
, ale ja nie
Google. A teraz łamigłówka: jak zebrać wszystkie grupy przechwytywania na potrzeby
w każdym przypadku? Wyjaśnienie oferty pakietowej String.prototype.matchAll()
pokazuje dwie możliwe metody. Nie będę ich tu opisywać, ponieważ mam nadzieję, że uda Ci się
nie będą mi potrzebne.
String.prototype.matchAll()
Jak wyglądałyby przykładowe wyjaśnienia w przypadku korzystania z funkcji matchAll()
? Zobacz.
const regex = /t(e)(st(\d?))/g;
const string = 'test1test2';
const matches = string.matchAll(regex);
for (const match of matches) {
console.log(match);
}
Warto zwrócić uwagę na kilka kwestii. W odróżnieniu od metody match()
, która zwraca
tablica w wyszukiwaniu globalnym, matchAll()
zwraca działający iterator
w piękny sposób z for...of
pętlami. iterator generuje tablicę dla argumentu
dla każdego dopasowania, w tym grupy przechwytywania z kilkoma dodatkami. Jeśli drukujesz
w konsoli będą one wyglądać tak:
['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', groups: undefined]
['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', groups: undefined]
Możesz zauważyć, że wartość każdego dopasowania jest tablicą w dokładnie takim samym formacie
w formacie zwracanym przez funkcję match()
dla nieglobalnych wyrażeń regularnych.
Materiały dodatkowe
Przeznaczone są głównie dla osób, które nie mają doświadczenia z wyrażeniami regularnymi z najlepszymi specjalistami. Być może znasz wyniki funkcji match() i matchAll(). (dla każdej iteracji) to tablice z dodatkowymi nazwami właściwości. Choć zauważyłem, że właściwości tych obiektów zawierają niedobory MDN (które Rozwiązano). Oto krótki opis.
index
- Indeks pierwszego wyniku w oryginalnym ciągu znaków. W powyższym przykładzie
test2
zaczyna się od pozycji 5, więcindex
ma wartość 5. input
- Kompletny ciąg znaków, względem którego uruchomiono
matchAll()
. W moim przykładzie było to'test1test2'
. groups
- Zawiera wyniki dowolnych nazwanych grup przechwytywania określonych w wyrażeniu regularnym.
Podsumowanie
Jeśli coś Cię ominęło, daj mi znać w komentarzach poniżej. Więcej informacji o najnowszych zmianach w JavaScript znajdziesz we wcześniejszych aktualizacjach lub na stronie V8.