为什么结束括号是一个必须转义为字面值的特殊字符?

时间:2013-09-23 12:07:24

标签: regex

很明显,开头括号“(”,以及其他字符之间必须进行转义(以反斜杠为前缀),以便正则表达式包含“文字左括号”:因为有正则表达式选项,“(”是引导。

但是,对于结束括号“)”,怎么会出现同样的情况呢?没有语法结构具有“)”作为引入令牌,是吗?

那么为什么我必须逃避关闭括号才能按字面意思理解?

当然,同样的问题也可以在其他结束括号中提出。

很抱歉这是“为什么会这样?”题。它可能是无法回答的。但如果 是一个很好的理由,那么了解它的唯一方法就是提问!

附录: 这个问题背后的理由是: 例如,http://www.regexguru.com/2008/12/dont-escape-literal-characters-that-arent-metacharacters/有充分的理由不为不需要前缀的字符添加前缀。

而imho,在大多数情况下,结束括号不需要加前缀: 由于没有开口的闭括号不是正则表达式组的一部分,我发现在这种情况下它需要被转义完全不合逻辑。

3 个答案:

答案 0 :(得分:6)

假设您要匹配持有右括号的组。如果没有转义,这将看起来像())。像(\))一样转义括号使正则表达式正确且明确地解析变得更容易(如果不可能)。

在(未转义)正则表达式(\w))中,结束括号是否属于该组,即是由第一个或第二个)关闭的组?例如,对于字符串abc)d,它是否与cc)匹配?

当然,一个可以省略一些转义字符,以防意义不明确(并且正则表达式解析器允许这样做)但它会有什么帮助?你可以在这里和那里保存一个角色,但每次你遇到一个)或另一个特殊角色时你都要想:“这是一个控制角色还是一个要匹配的角色?这是不明确的?”更好地使其清晰和一致。

答案 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 ')'