我一直在研究正则表达式,它将解析
格式的日期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()));
现在我只记录数据,但我确实认为,这里出了点问题。
答案 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使用两个不同的方法和相同的正则表达式语句,产生不同的结果。