2014-09-24 346 views
14

在.Net4.5,我發現的

System.Text.RegularExpressions.Regex.IsMatch(
    "00000000000000000000000000000", "^[1-9]|0$") 

結果爲真。

我期望的結果是錯誤的。我不知道爲什麼。你可以幫我嗎?

更新: 在開始的時候,我被驗證的正則表達式^-?[1-9]\d*|0$這是用來匹配在互聯網上找到整數,我發現有多個字符串0正則表達式匹配。

+3

正則表達式您輸入相匹配 - 有右側的解釋:http://regex101.com/r/fB9yK0/1 – 2014-09-24 08:00:03

+5

_你爲什麼期望它是假的?你認爲這個正則表達式想說什麼?你期待它的行爲如同'^([1-9] | 0)$'? – 2014-09-24 08:02:29

+0

@RayToal在我知道答案之前,我認爲'^ [1-9] | 0 $'等於'^ [0-9] $'。 – SubmarineX 2014-09-24 08:09:21

回答

46

問題是交流發電機的綁定行爲。默認情況下(即不使用分組),包含交流發電機(|)的表達式將匹配交流發電機左側的值或右側的值。

在表達

所以,你匹配兩者之一:

  • ^[1-9]
  • 0$

您對IsMatch方法調用返回true,因爲這兩個選項的第二匹配字符串00000000000000000000000000000

要限制交流發電機的綁定到你的表達的特定部分,你需要組使用括號,如下所示:

^([1-9]|0)$ 

把所有這些組合起來,有嚴格的表達式驗證整數,不允許前導零和負零,看起來是這樣的:

^(-?[1-9][0-9]*|0)$ 
+2

爲了擴大你的想法,你需要在你想要的部分周圍加上括號'()':'^([1-9] | 0)$'或者只是'^ [0-9] $' – Rhumborl 2014-09-24 08:02:42

+0

@Rhumborl是的。實際目標並不是真的很清楚,但我會更新我的答案以反映您的評論。 – 2014-09-24 08:03:40

+0

確實,我_assume_那是什麼所需要的 – Rhumborl 2014-09-24 08:05:00