Lepsze wyniki dopasowania za pomocą funkcji String.prototype.matchAll()

Joe Medley
Joe Medley

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ęc index 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.