The ]
如果没有相应的未转义符号,则符号不是字符类之外的特殊正则表达式运算符[
在它之前。只有特殊字符需要转义。 A[
是字符类之外的特殊正则表达式运算符(因为它可能标记字符类的起点)。一旦 Java 正则表达式引擎发现未转义的[
在模式中,它知道必须有一个]
关闭前面的字符类。无论逃逸与否,对于引擎来说都没有关系。如果没有开口[
表达式中,]
被视为纯粹的字面意思]
象征。所以,[abc]
将匹配a
, b
or c
, and \[abc]
or \[abc\]
将匹配[abc]
文字字符序列。
So, the [
应该总是逃避,并且]
不必逃避在字符类之外.
使用时在字符类中, both [
and ]
必须在 Java 正则表达式中转义,因为它们可能形成交集/减法模式,unless the ]
出现在字符类的开头(即"[a]".replaceAll("[]\\[]", "")
returns a
).
其他正则表达式风格
icu onigmo- 在 ICU 和 Onigmo 正则表达式风格中,]
行为与 Java 正则表达式风格相同。受影响的语言:swift, ruby, r (stringr
), kotlin, groovy.
pcre boost .net re2 python posix- 在Boost、PCRE中,]
不是字符类外部的特殊字符(即不需要转义),而是字符类内部的特殊字符(=需要转义)(仅当它是字符类中的第一个字符时才不需要转义。)在任何应该与文字匹配的地方转义它都不是错误]
字符。受影响的语言/工具:php, perl, c#/vb.net/etc., python, sed, grep, awk, elixir, r(默认基 R TRE 和 PCRE 均启用"perl=TRUE"
), tcl, 谷歌表格.
ECMAScript- 在 ECMAScript 风格中,]
在字符类之外并不特殊,而[
在字符类之外是特殊的。在角色类中,]
必须始终进行转义,即使它是字符类中的第一个字符。[
字符类内部并不特殊,但如果使用以下命令编译正则表达式,则转义它是一个错误/u
标志(在 JavaScript 中)。所以,这里要小心。受影响的语言:javascript, dart, c++, vba, 谷歌应用程序脚本(使用 JavaScript)。