很明显,开头括号“(”,以及其他字符之间必须进行转义(以反斜杠为前缀),以便正则表达式包含“文字左括号”:因为有正则表达式选项,“(”是引导。
但是,对于结束括号“)”,怎么会出现同样的情况呢?没有语法结构具有“)”作为引入令牌,是吗?
那么为什么我必须逃避关闭括号才能按字面意思理解?
当然,同样的问题也可以在其他结束括号中提出。
很抱歉这是“为什么会这样?”题。它可能是无法回答的。但如果 是一个很好的理由,那么了解它的唯一方法就是提问!
附录: 这个问题背后的理由是: 例如,http://www.regexguru.com/2008/12/dont-escape-literal-characters-that-arent-metacharacters/有充分的理由不为不需要前缀的字符添加前缀。
而imho,在大多数情况下,结束括号不需要加前缀: 由于没有开口的闭括号不是正则表达式组的一部分,我发现在这种情况下它需要被转义完全不合逻辑。
答案 0 :(得分:6)
假设您要匹配持有右括号的组。如果没有转义,这将看起来像())
。像(\))
一样转义括号使正则表达式正确且明确地解析变得更容易(如果不可能)。
在(未转义)正则表达式(\w))
中,结束括号是否属于该组,即是由第一个或第二个)
关闭的组?例如,对于字符串abc)d
,它是否与c
或c)
匹配?
当然,一个可以省略一些转义字符,以防意义不明确(并且正则表达式解析器允许这样做)但它会有什么帮助?你可以在这里和那里保存一个角色,但每次你遇到一个)
或另一个特殊角色时你都要想:“这是一个控制角色还是一个要匹配的角色?这是不明确的?”更好地使其清晰和一致。
答案 1 :(得分:2)
作为tobias_k答案的更具体的例子:
请看以下正则表达式:
(a*))
查看字符串bbaaa)bb
会捕获aaa
还是aaa)
?
结果很清楚
(a*\))
与
(a*)\)
答案 2 :(得分:1)
当然,同样的问题也可以在其他结束括号中提出。
不,这不正确(或者可能因一个正则表达式引擎而异。)
在Javascript正则表达式引擎]
和}
中不需要转义。
见这个例子:
var x = 'brackets)}]';
x.match(/]/); // works
x.match(/}/); // works
x.match(/)/); // failes
仅针对案例3,它失败并显示错误 Unmatched ')'