Skip to main content
 首页 » 编程设计

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

2024年02月23日39JeffreyZhao

这匹配:

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*)?)*$ 

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

请您参考如下方法:

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

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

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

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