c# - 为什么括号使我的正则表达式不匹配?

标签 c# regex

这匹配:

Console.WriteLine(Regex.IsMatch("15, 17-19", @"^\s*\d\d|\d\d\d\d\s*(?:-\s*\d\d|\d\d\d\d\s*)?(?:,\s*\d\d|\d\d\d\d\s*(?:-\s*\d\d|\d\d\d\d\s*)?)*$"));

但是当我在 ^ 之后和 $ 之前添加括号时它不会

Console.WriteLine(Regex.IsMatch("15, 17-19", @"^(\s*\d\d|\d\d\d\d\s*(?:-\s*\d\d|\d\d\d\d\s*)?(?:,\s*\d\d|\d\d\d\d\s*(?:-\s*\d\d|\d\d\d\d\s*)?)*)$"));

谁能告诉我为什么?

更新:

我现在才知道我原来的表达是错误的。我应该将我的 \d\d|\d\d\d\d 部分包含在这样的非捕获组中:

^\s*(?:\d\d|\d\d\d\d)\s*(?:-\s*(?:\d\d|\d\d\d\d)\s*)?(?:,\s*(?:\d\d|\d\d\d\d)\s*(?:-\s*(?:\d\d|\d\d\d\d)\s*)?)*$

也可以写成

^\s*(?:\d{2}|\d{4})\s*(?:-\s*(?:\d{2}|\d{4})\s*)?(?:,\s*(?:\d{2}|\d{4})\s*(?:-\s*(?:\d{2}|\d{4})\s*)?)*$

这将允许我在不改变行为的情况下根据需要添加额外的括号。谢谢。

最佳答案

带括号的第二个模式使 ^$ 元字符应用于整个模式,这意味着整个字符串必须匹配该模式。换句话说:

  • 匹配字符串开头(^)
  • 你的模式
  • 匹配字符串结尾($)

您的第一个模式通过了,因为它实际上被解释为 ^pattern1pattern2$,因此它部分匹配输入而不是完全匹配。这种模式的分割是:

  • 匹配字符串的开头和第一个替代项(从 ^ 到竖线符号)
  • Or 匹配第二个替代和字符串的结尾(在管道符号之后直到 $)

关于c# - 为什么括号使我的正则表达式不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650957/

相关文章:

C# WOW6432 注册表节点搞砸了

c# - a = (x == null) 的最佳语法?空 : x. 函数()

c# - DDD聚合根有一个创建对象的静态方法是否正确

c# - 为什么向下转换在运行时失败

c# - 清除文件内容

java - 验证文本字符串是否与 java 中预先确定的格式相匹配

java - 正则表达式查找金钱值(value)

java - 正则表达式在 Java 中匹配混合的 RTL 和 LTR 字符串

regex - Dart RegEx 不分割字符串

javascript - 如何在JavaScript中将句号、问号和感叹号后的首字母大写?