版本差异? Java 中的正则表达式转义

Version difference? Regex Escape in Java

似乎正则表达式转义在不同版本的 Java 中工作不同。

  1. 在 Java openjdk 16.0.1 中编译工作正常

  2. 在Javaopenjdk 11.0.11中抛出这个编译错误:

test.java:15: error: illegal escape character
        if (variable.matches("\s*")){

我知道,我通常对 \ 比较安全。我的问题:

从哪个版本开始改变了这个行为?为什么会这样?

新功能引入了引起您注意的行为 共 TextBlocks

这项新功能是在 Java 13 中首次引入的,具体的变化是您观察到的行为的原因,它包含在 Java 14 中的 TextBlocks 的第二次预览中Text Blocks Second Preview.

根据文本块第二次预览

the new \s escape sequence simply translates to a single space (\u0020).

The \s escape sequence can be used in both text blocks and traditional string literals.

此外,有关 TextBlocks 的这项新功能已正式包含在 Java17 的 LTS 版本中。

Java 15 introduced \s 作为有效的转义序列,在语言标准中表示“space”(unicode 0x20)。

无效的转义序列会产生编译时错误(这也在上面的 link 中)。由于在 Java 15 之前转义序列无效,因此引发了错误。从 Java 15 开始,它是一个有效的转义序列。