【问题标题】:Why closing square bracket "]" doesn't require escaping in regex?为什么右方括号“]”不需要在正则表达式中转义?
【发布时间】:2021-10-03 02:47:55
【问题描述】:

考虑数组:

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

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

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

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

【问题讨论】:

  • 正则表达式引擎将[ 视为字符类的开头,因此如果您指的是文字[ 字符,则需要转义。除非您正在定义字符类,否则它可能不会将] 读取为字符类的结尾,因此在这种情况下不需要转义。
  • 如果任一答案解决了您的问题,请考虑接受最能解决您问题的答案。

标签: java regex intellij-idea


【解决方案1】:

如果] 符号之前没有对应的未转义[,则] 符号不是字符类之外的特殊正则表达式运算符。只有特殊字符需要转义。 [ 是字符类之外的特殊正则表达式运算符(因为它可能标记字符类的起点)。一旦 Java 正则表达式引擎在模式中看到一个未转义的 [,它就知道必须有一个 ] 来关闭前面的字符类。不管逃不逃,对引擎来说都无所谓。如果表达式中没有开头的[,则] 被视为纯文字] 符号。因此,[abc] 将匹配 abc,而 \[abc]\[abc\] 将匹配 [abc] 文字字符序列。

因此,[ 应该始终被转义,] 不必在字符类之外转义

在字符类中使用时[] 都必须在 Java 正则表达式中进行转义,因为它们可能形成交集/减法模式,除非 ] 出现在字符类的开头(即"[a]".replaceAll("[]\\[]", "")returnsa)。

其他正则表达式风格

- 在 ICU 和 Onigmo 正则表达式风格中,] 的行为与 Java 正则表达式风格相同。受影响的语言: (stringr)、

- 在 Boost、PCRE 中,] 不是字符类之外的特殊字符(即不需要转义),而是一个特殊的字符字符类中的 char (=需要转义)(仅当它是字符类中的第一个字符时才需要转义。)在应该匹配文字 ] 的任何地方对其进行转义并不是错误字符。受影响的语言/工具://etc.、@4(默认值) base R TRE 和 PCRE 启用 "perl=TRUE")、

- 在 ECMAScript 风格中,] 在字符类之外并不特殊,而[ 在字符类之外是特殊的。在字符类中,] 必须始终被转义,即使它是字符类中的第一个字符。字符类中的[ 并不特殊,但是如果使用/u 标志(在JavaScript 中)编译正则表达式,则转义它是错误的。所以,这里要小心。受影响的语言:(使用 JavaScript)。

【讨论】:

    【解决方案2】:

    ] 仅当它是 [...] 的一部分时才被视为元字符。但是,如果您的正则表达式不包含未转义的开头 [] 将关闭),则此类括号被视为简单文字,不需要转义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      相关资源
      最近更新 更多