如何解决为什么括号会使我的正则表达式不匹配?
| 这符合: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$
,因此它部分匹配输入而不是完全匹配。该模式的细分为:
匹配字符串的开头和第一个替代项(从^
到管道符号)
或者匹配第二个备用字符串和字符串的结尾(在竖线符号之后直到$
)
,表达式中有管道-添加括号时,它将改变表达式的工作方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。