【问题标题】:"00000000000000000000000000000" matches Regex "^[1-9]|0$""000000000000000000000000000000" 匹配正则表达式 "^[1-9]|0$"
【发布时间】:2014-09-24 07:57:19
【问题描述】:

在.Net4.5中,我发现

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

是真的。

我期望的结果是假的。我不知道为什么。你能帮帮我吗?

更新: 一开始,我正在验证用于匹配互联网上的整数的正则表达式^-?[1-9]\d*|0$,我发现具有多个0 的字符串与正则表达式匹配。

【问题讨论】:

  • Regex 匹配您的输入 - 右侧有解释。:regex101.com/r/fB9yK0/1
  • 为什么你认为它是假的?你认为正则表达式想要表达什么?您是否希望它表现得像 ^([1-9]|0)$
  • @RayToal 在我知道答案之前,我认为^[1-9]|0$ 等于^[0-9]$
  • @RayToal 我已经添加了Update
  • @pwas 当 OP 询问 .NET 正则表达式时,这不是 PCRE 吗?

标签: c# .net regex


【解决方案1】:

问题在于交流发电机的绑定行为。默认情况下(即不使用分组),包含交流发电机 (|) 的表达式将匹配交流发电机左侧的值或右侧的值。

因此,在您的表达式中,您匹配以下任一:

  • ^[1-9]
  • 0$

您对IsMatch 方法的调用返回true,因为这两个选项中的第二个与字符串00000000000000000000000000000 匹配。

要将交流发电机的绑定限制在表达式的特定部分,您需要使用括号进行分组,如下所示:

^([1-9]|0)$

将所有这些放在一起,验证整数的严格表达式,不允许前导零和负零,可能如下所示:

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

【讨论】:

  • 要扩展它,您需要在要或的部分周围添加括号 ()^([1-9]|0)$ 或只是 ^[0-9]$
  • @Rhumborl 确实如此。问题的实际目标并不清楚,但我会更新我的答案以反映您的评论。
  • 确实,我认为这是必需的
  • 哦,我省略了一对括号。谢谢。
猜你喜欢
  • 2015-11-14
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2023-03-18
  • 2019-05-06
相关资源
最近更新 更多