Как захватить произвольное количество групп в JavaScript Regexp?

Я ожидаю, что эта строка JavaScript:

"foo bar baz".match(/^(\s*\w+)+$/)

будет возвращать что-то вроде:

["foo bar baz", "foo", " bar", " baz"]

, но вместо этого он возвращает только последнее захваченное совпадение:

["foo bar baz", " baz"]

Есть ли способ получить все захваченные совпадения?

77
задан polygenelubricants 22 August 2010 в 07:33
поделиться

4 ответа

Когда вы повторяете группа захвата, в большинстве ароматов сохраняется только последняя группа захвата; любой предыдущий захват перезаписывается. В некотором вкусе, например .NET, вы можете получить все промежуточные захваты, но это не относится к Javascript.

То есть в Javascript, если у вас есть шаблон с N группами захвата, вы можете захватить ровно N строк на совпадение, даже если некоторые из этих групп повторялись.

В общем, в зависимости от того, что вам нужно сделать:

  • Если это вариант, разбейте его по разделителям
  • Вместо сопоставления / (шаблон) + / , возможно, сопоставьте ] / pattern / g , возможно, в цикле exec
    • Обратите внимание, что эти два не совсем эквивалентны, но это может быть вариант
  • Выполнить многоуровневое сопоставление:
    • Захватить повторяющуюся группу в одном совпадении
    • Затем запустить другое регулярное выражение, чтобы разделить это совпадение.

Ссылки


Пример

Вот пример сопоставления в тексте с использованием цикла exec и последующего разделения на ; ] для получения отдельных слов ( см. также на ideone.com ):

var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";

var r = /<(\w+(;\w+)*)>/g;

var match;
while ((match = r.exec(text)) != null) {
  print(match[1].split(";"));
}
// c,d,e,f
// xx,yy,zz

Используемый шаблон:

      _2__
     /    \
<(\w+(;\w+)*)>
 \__________/
      1

Соответствует , , <слово; другое; пожалуйста> и т. Д. Группа 2 повторяется для захвата любого количества слов, но может сохранять только последний захват. Весь список слов попадает в группу 1; эта строка затем разбивается по разделителю точки с запятой.

Связанные вопросы

85
ответ дан 24 November 2019 в 11:00
поделиться

попробуйте использовать 'g':

"foo bar baz".match(/\w+/g)
4
ответ дан 24 November 2019 в 11:00
поделиться

Как насчет этого? "foo bar baz" .match (/ (\ w +) + / g)

7
ответ дан 24 November 2019 в 11:00
поделиться

Если у вас нет более сложных требований к разделению строк, вы можете разделить их, а затем вернуть с ними исходную строку:

var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);
6
ответ дан 24 November 2019 в 11:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: