String. prototype. matchAll()
Zwraca iterator wszystkich dopasowań wyrażenia regularnego, każde razem z grupami i pozycją w tekście.
- Zwraca
- Iterator tablic z dopasowaniami. Gdy nic nie pasuje, iterator jest pusty.
- Zmienia oryginał
- Nie
Przykład
#const report = 'HTML: 120 pkt, CSS: 95 pkt, JS: 140 pkt'
for (const match of report.matchAll(/(\w+): (\d+) pkt/g)) {
console.log(match[1], Number(match[2]), match.index)
}Definicja i zastosowanie
#Metoda matchAll() wyszukuje w napisie wszystkie dopasowania wyrażenia regularnego i zwraca je jako iterator. Każdy element to tablica taka jak z match() bez flagi g: pod indeksem 0 cały dopasowany tekst, pod kolejnymi grupy z nawiasów, a we właściwościach index i groups pozycja i nazwane grupy.
Rozwiązuje problem, z którym nie radzi sobie match(). Z flagą g dostajesz wszystkie dopasowania, ale bez grup, a bez flagi grupy tylko pierwszego dopasowania. matchAll() daje jedno i drugie naraz.
Wyrażenie musi mieć flagę g, inaczej metoda rzuci TypeError. Wynik jest iteratorem, a nie tablicą: przejdziesz po nim pętlą for...of, a tablicę zrobisz przez [...text.matchAll(re)] albo Array.from(). Po iteratorze można przejść tylko raz.
Składnia
#string.matchAll(regexp)Parametry
#regexp
RegExp | string
Wyrażenie regularne z flagąg. Zwykły napis zostanie zamieniony na wyrażenie z flagąg.
Więcej przykładów
#const text = 'Terminy: 2026-10-05, 2026-11-20'
const dates = [...text.matchAll(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g)]
console.log(dates.length)
console.log(dates.map((match) => `${match.groups.day}.${match.groups.month}`))const text = 'Zadanie 3 za 15 pkt, zadanie 7 za 40 pkt'
const re = /zadanie (\d+)/gi
console.log(text.match(re))
console.log([...text.matchAll(re)].map((match) => match[1]))match() z flagą g oddaje tylko całe dopasowania. Numery zadań z grupy (\d+) wyciągnie dopiero matchAll().
try {
'a1b2'.matchAll(/\d/)
} catch (error) {
console.log(error.name)
}
console.log([...'a1b2'.matchAll(/\d/g)].length)Obsługa przeglądarek
#Szeroko dostępne
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Iterator z
matchAll()można przejść tylko raz. Jeśli wyniki są Ci potrzebne kilka razy, od razu zamień go na tablicę:[...text.matchAll(re)]. - Nazwane grupy
(?<nazwa>...)czyta się łatwiej niż odwołaniamatch[1]imatch[2], zwłaszcza gdy grup jest kilka. - Jeśli potrzebujesz tylko samych dopasowanych fragmentów, bez grup i pozycji, wystarczy prostsze
text.match(/.../g).
Powiązane hasła
#- String.prototype.match()Dopasowuje napis do wyrażenia regularnego. Zwraca tablicę z dopasowaniem lub wszystkimi dopasowaniami albo null.
- RegExpWyrażenie regularne, czyli wzorzec do wyszukiwania, sprawdzania i zamiany fragmentów tekstu.
- String.prototype.replaceAll()Zwraca nowy napis, w którym wszystkie wystąpienia wzorca zamieniono na podany tekst lub wynik funkcji.
- for...ofPrzechodzi po kolejnych wartościach obiektu iterowalnego: tablicy, napisu, Map, Set i innych.
- Iteratory (Symbol.iterator)Protokół iteracji: obiekt z metodą [Symbol.iterator]() działa z for...of, spreadem i destrukturyzacją.
Widzisz błąd albo brakuje przykładu? Napisz do nas.