Javascript正则表达式没有按预期工作

时间:2011-04-19 20:29:25

标签: javascript regex

我一直在研究正则表达式,它将解析

格式的日期
3d 4m 5y

到一个数组,以便我可以用它做一些操作。

我写了这样的正则表达式:

((\d+)([d,m,y]))

返回的是

["3d", "3d", "3", "d"]

当我相信它应该回来时

["3d", "3d", "3", "d","4m","4","m"]

表示字符串

3d4m

它在我的代码中实现,如下所示:

c=console;
myregexp=/((\d+)([d,m,y]))/g;
//myregexp = new RegExp(regexstring);
c.log(myregexp.exec($("#dateInterval").val()));

现在我只记录数据,但我确实认为,这里出了点问题。

2 个答案:

答案 0 :(得分:2)

您写道:

  

我相信它应该回归

["3d", "3d", "3", "d","4m","4","m"]  

那不对。

使用使用'g'选项的正则表达式调用exec()会让它继续处理匹配,直到完成为止。返回数组不是所有匹配的集合。它是所有捕获的集合,用于最终匹配尝试。在第一次迭代中,它获得["3d", "3d", "3", "d"]。在第二次迭代中,它获得["4m", "4m", "4", "m"]。第一次迭代的捕获组被替换。换句话说,第一次迭代中第一次捕获中的“3d”在第二次迭代中被第一次捕获组中的4覆盖,依此类推。

要抓住所有比赛,你可以走绳子。像这样:

function test2()
{
    var value = "3d4m"; // $('#element').val()
    var re="(\\d+)([dmy])";
    var myregexp = new RegExp(re);
    while (value != "")
    {
        say("input: " + value);
        var result = myregexp.exec(value);
        if (result !== null) {
            say("r[1]: " + result[0]);  // 3d on 1st iteration, 4m on 2nd, etc.
            value = value.substr(result[0].length);
        }
    }
}

答案 1 :(得分:1)

我可能会离开这里,但根据w3学校的说法:

<强> exec()

  

此方法返回匹配的文本   如果找到匹配,否则它   返回null。

<强> match()

  

此方法返回一个数组   匹配,如果未找到匹配则为null。

这会让我相信exec()只返回一个结果。

Here's a fiddle使用两个不同的方法和相同的正则表达式语句,产生不同的结果。