String.prototype.matchAll()

Этот перевод не завершён. Пожалуйста, помогите перевести эту статью с английского

Метод matchAll() возвращает итератор по всем результатам при сопоставлении строки с регулярным выражением.

Синтаксис

str.matchAll(regexp)

Параметры

regexp
Объект регулярного выражения. Если передано значение, не являющееся объектом регулярного выражения, оно неявно преобразуется в RegExp используя new RegExp(obj).

Возвращаемое значение

Возвращается iterator (не перезапускаемый).

Примеры

Regexp.exec() и matchAll()

До добавления метода matchAll в JavaScript, можно было использовать метод regexp.exec (и регулярные выражения с флагом /g ) в цикле для получения доступа к совпадениям:

const regexp = RegExp('foo*','g');
const str = 'table football, foosball';

while ((matches = regexp.exec(str)) !== null) {
  console.log(`Found ${matches[0]}. Next starts at ${regexp.lastIndex}.`);
  // expected output: "Found foo. Next starts at 9."
  // expected output: "Found foo. Next starts at 19."
}

С появлением matchAll, нет необходимости использовать цикл while и метод exec с флагом /g.
Используя вместо этого метод matchAll, вы получаете итератор, который вы можете использовать более удобно с конструкциями for...of, array spread, или Array.from() :

const regexp = RegExp('foo*','g'); 
const str = 'table football, foosball';
let matches = str.matchAll(regexp);

for (const match of matches) {
  console.log(match);
}
// Array [ "foo" ]
// Array [ "foo" ]

// итерация больше недоступна после вызова for of
// Для создания нового итератора вызовите matchAll повторно
matches = str.matchAll(regexp);

Array.from(matches, m => m[0]);
// Array [ "foo", "foo" ]

Улучшенный доступ к группам захвата

Еще одна веская причина использовать matchAll это улучшенный доступ к группам захвата. Группы захвата игнорируются при использовании match() с глобальным флагом /g:

var regexp = /t(e)(st(\d?))/g;
var str = 'test1test2';

str.match(regexp); 
// Array ['test1', 'test2']

С matchAll у вас появляется к ним доступ:

let array = [...str.matchAll(regexp)];

array[0];
// ['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4]
array[1];
// ['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', length: 4]

Спецификации

Спецификация Статус
String.prototype.matchAll Stage 3

Браузерная совместимость

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
matchAllChrome Полная поддержка 73Edge Полная поддержка 79Firefox Полная поддержка 67IE Нет поддержки НетOpera Полная поддержка 60Safari Полная поддержка 13WebView Android Полная поддержка 73Chrome Android Полная поддержка 73Firefox Android Полная поддержка 67Opera Android Полная поддержка 52Safari iOS Полная поддержка 13Samsung Internet Android Нет поддержки Нетnodejs Полная поддержка 12.0.0

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки

Смотрите также