2011-04-13 20 views
1

这符合:为什么括号会使我的正则表达式不匹配?

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

这将使我增加额外的括号根据需要在不改变行为。谢谢。

+6

不是问题的答案,但我肯定会考虑简化它 - 用'\ d {4}'替换'\ d \ d \ d \ d'以提高可读性,并使其更短。 – Spudley 2011-04-13 14:35:53

回答

2

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

  • 比赛开始(^
  • 你的模式
  • 比赛结束($

你的第一个模式是路过,因为它实际上是被解释为^pattern1pattern2$,因此它与输入部分匹配,而不是完全匹配输入。此模式的击穿是:(高达管道符号从^)串和第一备用

  • 或者匹配的第二替代和字符串的末尾的

    • 匹配开头(管道符号直到后$
  • 2

    您在表达式中有管道 - 它会在添加括号时更改表达式的工作方式。

    +0

    它以什么方式改变它? – adam0101 2011-04-13 14:42:49

    +0

    Ahmad Mageed发布了一个更好的答案,解释了这一变化。 – 2011-04-13 14:49:32

    相关问题