2014-03-24 38 views
1

我真的很困惑與正則表達式重複與大括號的部分。考慮下面的例子:混淆正則表達式重複部分

var dateTime = /\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}/; 
console.log(dateTime.test("30/1/2003 8:45")); 
// true 

現在,如果我改變30到300000和45到455555,我會再次變爲真實!外號碼之間的其他部分是可以的,結果如預期。

有人能幫我找到問題嗎?

謝謝。

+0

你不匹配_String_ –

回答

3

你不匹配的字符串^$)的開頭和結尾所以它只是在字符串它仍然發生在任何地方找到一個匹配,然後給出正確的。

300000/1/2003 8:455555 
    dd/m/yyyy h:mm 

你可能想

/^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}$/; 

還是要更加準確;

/^(?:0?[1-9]|[12]\d|3[01])\/(?:0?[1-9]|1[0-2])\/\d{4} (?:0?\d|1\d|2[0-3]):[0-5]\d$/; 
  • (?:pattern)非捕獲組
  • pattern?patternn是可選
  • [1-9]字符類;範圍內的數19
  • pattern1|pattern2要麼pattern1pattern2
  • [12]字符類;無論是12
  • \d一樣[0-9]
  • pattern{4}patternn發生4
+1

的開始和結束時它看起來並不像你的正則表達式匹配的一天數字從10到19.另外,爲什麼要去匹配所有數字的麻煩,但允許任何兩位數的時間? 12:87不是有效的時間! –

+0

@NiettheDarkAbsol愚蠢的我,讓我們修復**編輯**,現在我已經允許有'00'小時了24小時 –

1

發生的事情是,當您將30更改爲30000時,30000的最後兩個零(00)匹配,45555匹配停止前兩位數字(45),並且字符串的其餘部分不匹配。

要停止發生這種情況,必須指出字符串必須以指定的正則表達式開始和結束。
這可以使用anchors完成。
這樣的 -

var dateTime = /^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}$/; 
       ^         ^
1

你不是整個字符串,只是其中的一部分匹配 - 使用test功能,這足以返回True

試試這個:

/^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}$/ 

^錨字符串的開頭匹配,$一個字符串的結尾相匹配。

1

您可以使用string.match(regex)而不是regex.test(string)來查找有關比賽的更多有用信息。

在這種情況下,您會看到它與00/1/2003 8:45匹配,因爲您沒有分別使用^$來標記主題字符串的開頭和結尾。