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

问题描述

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...