Я ожидаю, что эта строка JavaScript:
"foo bar baz".match(/^(\s*\w+)+$/)
будет возвращать что-то вроде:
["foo bar baz", "foo", " bar", " baz"]
, но вместо этого он возвращает только последнее захваченное совпадение:
["foo bar baz", " baz"]
Есть ли способ получить все захваченные совпадения?
Когда вы повторяете группа захвата, в большинстве ароматов сохраняется только последняя группа захвата; любой предыдущий захват перезаписывается. В некотором вкусе, например .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; эта строка затем разбивается
по разделителю точки с запятой.
попробуйте использовать 'g':
"foo bar baz".match(/\w+/g)
Как насчет этого? "foo bar baz" .match (/ (\ w +) + / g)
Если у вас нет более сложных требований к разделению строк, вы можете разделить их, а затем вернуть с ними исходную строку:
var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);