2011-04-19 46 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