这匹配:
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 匹配第二个替代和字符串的结尾(在管道符号之后直到
$
)
关于c# - 为什么括号使我的正则表达式不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650957/