繁体   English   中英

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

[英]Why do parentheses make my regex not match?

匹配:

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$ ,因此它部分匹配输入而不是完全匹配。 这种模式的细分是:

  • 匹配字符串的开头和第一个备用(从^到管道符号)
  • 或者匹配第二个备用字符串和字符串结尾(在管道符号之后直到$

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM