问题描述
|
这符合:
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,@\"^(\\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$
,因此它部分匹配输入而不是完全匹配。该模式的细分为:
匹配字符串的开头和第一个替代项(从^
到管道符号)
或者匹配第二个备用字符串和字符串的结尾(在竖线符号之后直到$
)
,表达式中有管道-添加括号时,它将改变表达式的工作方式。