为什么关闭方括号"]"不需要在Java正则表达式中转义?

Che*_*rry 4 java regex intellij-idea

考虑一下数组:

new Pattern[] {Pattern.compile("\\["),Pattern.compile("\\]") };
Run Code Online (Sandbox Code Playgroud)

Intellij IDEA告诉我这\\是多余的,并告诉我将其替换为]例如结果是:

new Pattern[] {Pattern.compile("\\["),Pattern.compile("]") };
Run Code Online (Sandbox Code Playgroud)

为什么第一个Pattern.compile("\\[")\\好的,但是第二个是多余的?

Wik*_*żew 11

]如果[在它之前没有相应的非转义符号,则该符号不是字符类之外的特殊正则表达式运算符.只有特殊字符才需要转义.A [是字符类之外的特殊正则表达式运算符(因为它可能标记字符类的起点).一旦Java正则表达式引擎[在模式中看到未转义,它就知道必须有一个]关闭前面的字符类.无论是否逃脱,对发动机都无关紧要.如果[表达式中没有空格,则将]其视为仅仅是文字]符号.因此,[abc]将匹配a,bc,和/ \[abc]\[abc\]将匹配[abc]文字字符序列.

因此,[应该始终进行转义,并且]不必在字符类之外进行转义.

当用于一个字符类中,既[]必须一个Java正则表达式内被转义为它们可形成相交/减法模式.


Psh*_*emo 6

]如果它是其中一部分,则仅被视为元字符[...].但是如果你的正则表达式不包含未关闭的未转义开口[,]那么这种括号被认为是简单的文字并且不需要转义.