版本差异? Java 中的正则表达式转义
Version difference? Regex Escape in Java
似乎正则表达式转义在不同版本的 Java 中工作不同。
在 Java openjdk 16.0.1 中编译工作正常
在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 开始,它是一个有效的转义序列。
似乎正则表达式转义在不同版本的 Java 中工作不同。
在 Java openjdk 16.0.1 中编译工作正常
在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 开始,它是一个有效的转义序列。