JavaScriptNapisy

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
Na tej stronie

Przykład

#
JavaScript
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)
}
Konsola
HTML 120 0
CSS 95 15
JS 140 28

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

#
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

#
Nazwane grupy i tablica wyników
JavaScript
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}`))
Konsola
2
['05.10', '20.11']
Porównanie z match()
JavaScript
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]))
Konsola
['Zadanie 3', 'zadanie 7']
['3', '7']

match() z flagą g oddaje tylko całe dopasowania. Numery zadań z grupy (\d+) wyciągnie dopiero matchAll().

Pułapka: brak flagi g
JavaScript
try {
  'a1b2'.matchAll(/\d/)
} catch (error) {
  console.log(error.name)
}

console.log([...'a1b2'.matchAll(/\d/g)].length)
Konsola
TypeError
2

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łania match[1] i match[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

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.