2011-04-19 41 views
1

我一直工作在一个正则表达式不工作,那会从的Javascript正则表达式如预期

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

'exec'可能不会为你递归组合它们。你确定你不是瞄准'console.log('3d 4m 5y'.match(myregexp));'? – 2011-04-19 20:39:35

+3

这与你的问题没有多大关系,但你应该从你的角色类中移除逗号:'[dmy]'是你想要的。否则,逗号也会匹配。 – 2011-04-19 20:41:30

回答

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

我可以在这里是关闭基地,但根据W3学校:如果找到匹配

exec()

这个方法返回匹配的文本 ,否则 返回null。

match()

此方法,如果没有发现匹配返回 匹配阵列,或空。

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

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

+1

w3schools == W3文档,whaat? – user422039 2011-04-19 21:17:35

+0

woops ..意思是学校:P – 2011-04-19 21:26:25