2

很明显,在正则表达式中,必须对左括号“(”以及其他字符进行转义(以反斜杠为前缀)以包含“文字左括号”:因为存在“(”是前导的正则表达式选项 -在。

但是,右括号“)”为什么也一样呢?没有将“)”作为引入标记的语法结构,是吗?

那么,为什么我必须避开右括号才能按字面意思理解它们呢?

当然,也可以对其他右括号提出相同的问题。

对不起,这是一个“为什么会这样?” 问题。这可能是无法回答的。但如果有充分的理由,了解它的唯一方法就是询问!

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

而且恕我直言,在大多数情况下,右括号不需要前缀:由于没有左括号的右括号不是正则表达式组的一部分,所以我发现在这种情况下无论如何都需要对其进行转义是完全不合逻辑的。

4

3 回答 3

6

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

在(未转义的)正则表达式(\w))中,右括号是否属于组,即组是由第一个还是第二个封闭)?例如,对于字符串abc)d,它匹配c还是c)

当然,如果含义不模棱两可(并且正则表达式解析器允许这样做),可以省略一些转义字符,但它有什么帮助呢?你在这里和那里保存一个字符,但每次遇到一个)或另一个特殊字符时,你必须思考:“这是控制字符还是要匹配的字符?它是模棱两可的吗?” 最好让它清晰一致。

于 2013-09-23T12:15:30.007 回答
2

作为 tobias_k 答案的更具体示例:

查看以下正则表达式:

(a*))

查看bbaaa)bb它会捕获的字符串aaa还是aaa)

结果很清楚

(a*\))

相对

(a*)\)
于 2013-09-23T12:20:18.677 回答
1

当然,也可以对其他右括号提出相同的问题。

不,这是不正确的(或者可能因一个正则表达式引擎而异)。

在 Javascript 正则表达式引擎中]}不需要转义。

看这个例子:

var x = 'brackets)}]';

x.match(/]/); // works

x.match(/}/); // works

x.match(/)/); // failes

仅适用于案例 3,它失败并出现错误Unmatched ')'

于 2013-09-23T12:23:17.047 回答