在数组中存储 JS 正则表达式捕获组的最佳方法



正是标题所要求的。我将在解释我的问题时提供一些示例。

测试字符串:

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

比如说,我想提取#之间的所有文本(所有foo,但不是bar)。

var matches = test.match(/#(.*?)#/g);

如上所述使用.match,它将存储所有匹配项,但它只会丢弃看起来捕获组。

var matches2 = /#(.*?)#/g.exec(test);

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

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

所以,我的问题是,有没有比使用 .exec 循环访问它并调用array.push来存储捕获的组更好的方法来仅存储匹配的捕获组?

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

 [0] => (string) foo
 [1] => (string) foo
 [2] => (string) foo

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

你也可以使用.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方法多次查找同一字符串中的连续匹配项。

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

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

var matches = [];
var test = "#foo# #foo# bar #foo#";
test.replace(/#(.*?)#/g, function (string, match) {
    matches.push(match);
});
alert(JSON.stringify(matches));

希望对您有所帮助。

data.replace(/.*?#(.*?#)/g, '$1').split(/#/)
没有循环,没有函数。

如果有人有类似的挖矿需求,我需要为 Django 风格的 URL 配置处理程序提供一个匹配函数,该函数可以将路径"参数"传递给控制器。我想出了这个。当然,如果匹配"$",它不会很好地工作,但它不会在"$1.00"上中断。它比必要的更明确一点。你可以从 else 语句返回匹配的组,而不用打扰 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) );

另一种想法,尽管exec同样有效。

var s= "#foo# #foo# bar #foo#";
s= s.match(/#([^#])*#/g).join('#').replace(/^#+|#+$/g, '').split(/#+/);

相关内容

最新更新