2014-10-16 59 views
0

爲什麼這個js正則表達式無法解析0-23的數字?正則表達式無法解析0-23的數字

pattern = /([0-1]?[0-9]|2[0-3])/ 
"12".match(pattern) // => matches 12 
"23".match(pattern) // => matches 2 (expected 23) 
+0

'00','01'等匹配嗎? – georg 2014-10-16 16:35:11

+1

我認爲最明確和最簡單的做法是檢查字符串是否是非負整數的表示形式,如果是,則將其轉換爲整數並查看它是否落入範圍'0-23 '。我很好奇爲什麼你選擇用正則表達式來做這件事,假設它不只是一個練習。 – 2014-10-20 01:18:16

回答

3

正則表達式返回第一個匹配。 [0-1]?[0-9]匹配2

爲了得到你想要的東西,你需要調整不同模式順序:

var pattern = /2[0-3]|[0-1]?[0-9]/; 

var pattern = /2[0-3]|[0-1]?[0-9]/; 
 
document.write("12".match(pattern)); 
 
document.write('<br/>'); 
 
document.write("23".match(pattern));

UPDATE

上面將匹配234返回23。如果你不想與之相匹配的,你可以使用單詞邊界\b,或^$錨作爲Gergo Erdosi建議:

var pattern = /\b2[0-3]\b|\b[0-1]?[0-9]\b/; 

var pattern = /\b(2[0-3]|[0-1]?[0-9])\b/; 
+3

這也將匹配234 – Christophe 2014-10-16 16:36:07

+0

@Christophe,謝謝你指出。我相應地更新了答案。 – falsetru 2014-10-16 16:42:14

2

這是爲什麼JS正則表達式未能從0-23解析數?

因爲您的正則表達式中的第一個模式將始終嘗試匹配輸入字符串(即|之前的模式)。如果發現匹配,則不會進入下一個模式(即,在|之後的模式)。你的第一個模式匹配2,所以它沒有去下一個。

它會工作,如果你扭轉模式的順序。

OR

最好使用開始和結束的錨,而驗證輸入字符串。

> var pattern = /^([0-1]?[0-9]|2[0-3])$/g; 
undefined 
> "12".match(pattern) 
[ '12' ] 
> "23".match(pattern) 
[ '23' ] 
1

確保正則表達式完整的字符串匹配:

pattern = /^([0-1]?[0-9]|2[0-3])$/ 
1

您是八九不離十。嘗試這樣的:

pattern = /^([0-1]?[0-9]|2[0-3])$/ 

您的表達式當前匹配表達式的第一部分,然後才能評估下半部分。有幾種方法可以解決這個問題,但匹配輸入的全部內容可能是最簡單的。

+0

此答案已被張貼... – Christophe 2014-10-16 16:40:41

+0

這不是當我開始打字。 :) – 2014-10-16 16:41:09