为什么右方括号“]”不需要在正则表达式中转义?

2023-11-22

考虑数组:

new Pattern[] {Pattern.compile("\\["),Pattern.compile("\\]") };

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

new Pattern[] {Pattern.compile("\\["),Pattern.compile("]") };

为什么在第一Pattern.compile("\\[") is the \\好的,但是对于第二个来说它是多余的吗?


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)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么右方括号“]”不需要在正则表达式中转义? 的相关文章

随机推荐