匹配:
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*)?)*$
这样我就可以根据需要添加额外的括号而不改变行为。感谢。
答案 0 :(得分:2)
表达式中有管道 - 它会在您添加括号时更改表达式的工作方式。
答案 1 :(得分:2)
带括号的第二个模式使^
和$
元字符适用于整个模式,这意味着整个字符串必须与模式匹配。换句话说:
^
)$
)你的第一个模式正在传递,因为它实际上被解释为^pattern1
或pattern2$
,因此它部分匹配输入而不是完全匹配。这种模式的细分是:
^
到管道符号)$
)