提问人:Fabrício Matté 提问时间:6/4/2012 最后编辑:YahkobFabrício Matté 更新时间:6/15/2016 访问量:11962
在数组中存储 JS 正则表达式捕获组的最佳方式?
Best way to store JS Regex capturing groups in array?
问:
正是标题所要求的。在解释我的问题时,我将提供一些示例。
测试字符串:
var test = "#foo# #foo# bar #foo#";
比如说,我想提取之间的所有文本(所有 s 但不是)。#
foo
bar
var matches = test.match(/#(.*?)#/g);
如上所述,它将存储所有匹配项,但只会丢弃它看起来的捕获组。.match
var matches2 = /#(.*?)#/g.exec(test);
该方法显然只在数组的位置返回第一个结果的匹配字符串,而我在该位置中唯一捕获该匹配组。.exec
0
1
我已经用尽了 SO、Google 和 MDN 寻找答案,但无济于事。
所以,我的问题是,有没有更好的方法来只存储匹配的捕获组,而不是循环访问并调用来存储捕获的组?.exec
array.push
我对上述测试的预期数组应该是:
[0] => (string) foo
[1] => (string) foo
[2] => (string) foo
接受纯 JS 和 jQuery 答案,如果您使用 .=]console.log
答:
我不确定这是否是您要找的答案,但您可以尝试以下代码:
var matches = [];
var test = "#foo# #foo# bar #foo#";
test.replace(/#(.*?)#/g, function (string, match) {
matches.push(match);
});
alert(JSON.stringify(matches));
希望对你有所帮助。
评论
.replace
.exec
你可以使用 too like following 来构建一个数组.exec
var arr = [],
s = "#foo# #bar# #test#",
re = /#(.*?)#/g,
item;
while (item = re.exec(s))
arr.push(item[1]);
alert(arr.join(' '));
从这里找到
好吧,它仍然有一个循环,如果你不想要一个循环,那么我认为你必须去.在这种情况下,代码将像.replace()
var arr = [];
var str = "#foo# #bar# #test#"
str.replace(/#(.*?)#/g, function(s, match) {
arr.push(match);
});
查看 MDN DOC 中的这些行,它解释了您关于如何更新属性的查询,exec
lastIndex
如果正则表达式使用“g”标志,则可以使用 exec 方法多次查找同一字符串中的连续匹配项。
执行此操作时,搜索将从 正则表达式的 lastIndex 属性(test 也将推进 lastIndex 属性)。
评论
.exec
item
.exec
lastIndex
the search starts at the substring of str specified by the regular expression's lastIndex property (test will also advance the lastIndex property).
另一个想法,虽然 exec 同样高效。
var s= "#foo# #foo# bar #foo#";
s= s.match(/#([^#])*#/g).join('#').replace(/^#+|#+$/g, '').split(/#+/);
data.replace(/.*?#(.*?#)/g, '$1').split(/#/)
没有循环,没有函数。
评论
["foo", "foo", "foo"]
["foo", "foo", "foo", ""]
如果有人有与我类似的需求,我需要一个 Django 风格的 URL 配置处理程序的匹配函数,该处理程序可以将路径“参数”传递给控制器。我想出了这个。当然,如果匹配“$”,它不会很好地工作,但它不会在“$1.00”上中断。它比必要的更明确一点。您可以从 else 语句返回 matchedGroups,而不必打扰 for 循环测试,而是 ;;在循环中,声明有时会吓坏人们。
var url = 'http://www.somesite.com/calendar/2014/june/6/';
var calendarMatch = /^http\:\/\/[^\/]*\/calendar\/(\d*)\/(\w*)\/(\d{1,2})\/$/;
function getMatches(str, matcher){
var matchedGroups = [];
for(var i=1,groupFail=false;groupFail===false;i++){
var group = str.replace(matcher,'$'+i);
groupFailTester = new RegExp('^\\$'+i+'$');
if(!groupFailTester.test(group) ){
matchedGroups.push(group);
}
else {
groupFail = true;
}
}
return matchedGroups;
}
console.log( getMatches(url, calendarMatch) );
评论