【问题标题】:版本区别? Java中的正则表达式转义
【发布时间】:2022-01-16 05:44:16
【问题描述】:

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

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

  2. 在 Java openjdk 11.0.11 中抛出此编译错误:

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

我知道,我通常对\\ 比较放心。我的问题:

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

【问题讨论】:

  • \s,带有 one 反斜杠,没有正则表达式的含义。它要么是控制字符,要么只是字母s
  • 查看version 13version 14String::translateEscapes的文档可以看出"\s"是在版本14中引入的,并且编码了一个空格字符。
  • 请注意,这不是正则表达式转义。它是字符串文字转义。

标签: java regex escaping version


【解决方案1】:

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

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

根据文本块第二次预览

新的 \s 转义序列仅转换为单个空格 (\u0020)。

\s 转义序列可用于文本块和繁体 字符串字面量。

这个关于 TextBlocks 的新功能也正式包含在 Java 17 的 LTS 版本中。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 2016-06-15
    • 2021-07-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多