2014-09-24 169 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