2011-03-07 116 views
0

我正在使用asp.net RegularExpressionValidator來檢查多行文本框上的輸入。我幾乎擁有它,但我必須錯過一些東西。這是應該的:如何寫正則表達式來匹配數字範圍?

1 => valid 

1-10 => valid 

1-10,45,50 => valid 

1 10 45 50 => valid 

111 => INVALID 

然而,111是回來有效

這裏是我使用正則表達式:"(([0-9]{1,2})(,|\s|-)?)*",它適用於一切,但111,在跟它有效。我知道它爲什麼認爲它是有效的,我只是不知道如何使它失效。

+1

你想驗證什麼? 3位數字還是'111'? – Augusto 2011-03-07 21:22:42

+1

是的,這裏的規則是什麼? – 2011-03-07 21:23:39

+0

規則是他們可以輸入一個數字,或一個帶短劃線或空格的數字,或兩者都有,但不能超過一個短劃線或空格,也不能有長度不超過2個數字的字母和數字。 – 2011-03-07 21:25:36

回答

3

不要讓分隔符可選的,那麼你將匹配數全無數,因此匹配111,而不是做這樣的事情:

"[0-9]{1,2}([-,\s][0-9]{1,2})*" 

編輯:爲了清晰:如果您的正則表達式引擎與整個字符串不匹配,您需要在開始處添加^,並在正則表達式的末尾添加$

+0

這是完美的,謝謝! – 2011-03-07 21:31:19

+0

真的嗎?根據[rubular](http://www.rubular.com/),它也會匹配111.我認爲有需要錨'\ b',請參閱下面的答案。 – stema 2011-03-07 21:45:57

+1

@stema,這是一個很好的答案,它只匹配,因爲他缺少開始和結束錨點,如果加上'/ ^([0-9] {1,2}([ - ,\ s] [0-9] { 1,2})*)$ /'應該可以正常工作。 – sln 2011-03-07 22:16:33

0

您寫的正則表達式匹配來自「111」的「11」和零次重複模式。如果你換你的正則表達式中的^ ... $它應該工作:

^(([0-9]{1,2})(,[\s-])?)*$ 

自那時以來,正則表達式將不允許字符串中的其他字符。

+0

不,它仍然會匹配111,因爲它是可以爲空的分隔符,它可以匹配111. – markijbema 2011-03-07 21:28:23

+0

RegularExpressionValidator已經隱式添加了。 – 2011-03-07 21:32:05

0

在您的[0-9]{1,2}條款之後,您需要一個負面預測來確保下一個字符不是數字。我不熟悉asp.net,但像[0-9]{1,2}(?![0-9])可能會產生更好的結果。有關lookahead的更多信息,請參閱this page

編輯:上面張貼的正則表達式有幫助,但仍匹配111的最後兩位數字。以下正則表達式應該可以工作(如使用online regex tester進行驗證)。它在開始處添加了一個詞邊界錨點,這將防止表達式在數字中間開始匹配。它還使分隔符成爲強制性的,而不是可選的。這種組合消除了對前瞻的需求。

(\b([0-9]{1,2})(-|,|\s|$))+ 
+0

這匹配一切 – sln 2011-03-07 22:32:10

+0

@ sln-我正在使用的正則表達式測試程序是由Javascript的正則表達式引擎驅動的,我想asp.net引擎的設計有點不同。 – bta 2011-03-07 22:36:49

+0

'(whatever)*'將始終報告成功的匹配,因爲它可以匹配任何應用的空字符串。對於我所知道的每種正則表達式都是如此。 – 2011-03-07 23:22:11

0

將您的圖案左移錨點^*是貪婪的,你在第二個和第三個1111匹配。

0

也許會讓事情變得更簡單一點,把它分解成多個正則表達式檢查?

如果字符串匹配(([0-9]{1,2})(,|\s|-)?)*,則檢查字符串是否匹配\d{3,}。如果是這樣,那麼通過失敗。

+0

'(([0-9] {1,2})(,| \ s | - )?)*'匹配所有內容 – sln 2011-03-07 22:35:16

0

我認爲你需要分隔符。 '?'允許零個或一個實例。

0

我覺得有兩個問題。一個問題是驗證每個用戶輸入的字符的正則表達式。另一個正則表達式提取數據之後。

要使用一個正則表達式驗證每個輸入字符,結束錨點比起始點更重要,雖然起始錨點,不需要的字符可以進入。

所以上rubular.com,這個特定的正則表達式允許[ - ]使用規則

  1. 字符不超過2位成一排
  2. commma或空間或破折號,不超過2

最後,數據提取將有所不同,所以這隻適用於每個字符的用戶輸入。

它在我嘗試的所有變種上都能夠工作。

^(?:\b\d{1,2}(?:([, -])(?!\1)[, -]?|))+$

\b確需distinquish 3位在一排。
試一試。

相關問題