在阵列中存储JS Regex捕获组的最佳方法?

Fab*_*tté 14 javascript regex

究竟是什么标题要求.在解释我的问题时,我会提供一些例子.

测试字符串:

var test = "#foo# #foo# bar #foo#";
Run Code Online (Sandbox Code Playgroud)

说,我想在#(所有foo但不是bar)之间提取所有文本.

var matches = test.match(/#(.*?)#/g);
Run Code Online (Sandbox Code Playgroud)

使用.match如上面,它就会储存所有的比赛,但它会简单地扔掉捕获组看来.

var matches2 = /#(.*?)#/g.exec(test);
Run Code Online (Sandbox Code Playgroud)

.exec方法显然只返回0数组位置中第一个结果的匹配字符串,以及该位置中该匹配的唯一捕获组1.

我已经筋疲力尽,谷歌和MDN正在寻找无济于事的答案.

所以,我的问题是,有没有更好的方法来存储匹配的捕获组,而不是通过它来.exec调用array.push以存储捕获的组?

我上面测试的预期数组应该是:

 [0] => (string) foo
 [1] => (string) foo
 [2] => (string) foo
Run Code Online (Sandbox Code Playgroud)

如果您发布JSFiddle,则接受纯JS和jQuery答案,额外的cookie console.log.=]

Pra*_*Nag 15

你可以使用.exec以下来构建一个数组

var arr = [],
    s = "#foo# #bar# #test#",
    re = /#(.*?)#/g,
    item;

while (item = re.exec(s))
    arr.push(item[1]);

alert(arr.join(' '));?
Run Code Online (Sandbox Code Playgroud)

工作小提琴

这里发现

嗯,它仍然有一个循环,如果你不想要循环,那么我认为你必须去.replace().在这种情况下,代码就像

var arr = [];
var str = "#foo# #bar# #test#"
str.replace(/#(.*?)#/g, function(s, match) {
                           arr.push(match);
                        });
Run Code Online (Sandbox Code Playgroud)

检查来自MDN DOC的这些行,它解释了您对如何exec更新lastIndex属性的查询,

如果正则表达式使用"g"标志,则可以多次使用exec方法在同一字符串中查找连续匹配.

执行此操作时,搜索从正则表达式的lastIndex属性指定的str的子字符串开始(test也将使lastIndex属性前进).


Aad*_*hah 6

我不确定这是否是您正在寻找的答案,但您可以尝试以下代码:

var matches = [];

var test = "#foo# #foo# bar #foo#";

test.replace(/#(.*?)#/g, function (string, match) {
    matches.push(match);
});

alert(JSON.stringify(matches));
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。