【问题标题】:Regex in Spring Boot YMLSpring Boot YML 中的正则表达式
【发布时间】:2019-03-19 03:41:49
【问题描述】:

我有一个 Spring Boot 网络应用:

在 application.properties 中,我有这个属性,其值为正则表达式:

mytest.regex=^[a-zA-Z0-9()\\-=\\*\\.\\?\\|;,+\\/:&_ \"]*$

我将其注入到控制器中,如下所示:

@Value("${mytest.regex}")
private String regex;

并在控制器方法中打印,然后编译使用:

Pattern.compile(regex)

编译成功,没有任何异常,并在控制台打印以下行(注意Java相关的转义字符不是输出):

^[a-zA-Z0-9()\-=\*\.\?\|;,+\/:&_ "]*$

现在,我将 application.properties 文件替换为 application.yml。文件内容现在如下所示:

mytest:
  regex: ^[a-zA-Z0-9()\\-=\\*\\.\\?\\|;,+\\/:&_ \"]*$

请注意,正则表达式完全相同。

现在控制台输出是:

^[a-zA-Z0-9()\\-=\\*\\.\\?\\|;,+\\/:&_ \"]*$

Pattern.compile(regex) 抛出 java.util.regex.PatternSyntaxException: Illegal character range near index 16

现在,我将正则表达式中的 = 转义为:

^[a-zA-Z0-9()\\-\\=\\*\\.\\?\\|;,+\\/:&_ \"]*$

控制台输出是(注意不像属性文件Java相关的转义字符仍然存在):

^[a-zA-Z0-9()\\-\\=\\*\\.\\?\\|;,+\\/:&_ \"]*$

并且Pattern.compile(regex) 成功。

现在,请有人解释一下:

  1. 为什么在 yml 的情况下,控制台输出显示 Java 相关的转义字符
  2. 为什么= 需要在 yml 中转义,而不是在属性中

【问题讨论】:

    标签: java regex spring spring-boot yaml


    【解决方案1】:

    嗯,

    我几乎每周有五天使用正则表达式 - 已经快一年了。

    首先,我 100% 确定左括号和右括号是正则表达式编译器希望看到的控制字符:

    ^[a-zA-Z0-9\(\)\-=\*\.\?\|;,+\/:&_ "]*$

    注意,我在括号前添加了一个反斜杠。并非所有的正则表达式编译器都是平等的,但我在 Java 中使用的那个可能希望它们被转义。

    其次, Java 编译器和 Java 正则表达式编译器(内置于 Java)也不相同。您需要“转义转义字符”(包括 双反斜杠)的唯一原因是因为Java 的语言编译器首先编译代码,Java 的(运行时)正则表达式编译器第二运行。

    如果正则表达式解析器正在运行并读取 YML 文件不是首先由 Java 编译器编译的,那么您就不需要 双重转义(转义转义字符 - 又名 '反斜杠')。相反,只在你的 表达。

    【讨论】:

    • 对不起,它没有回答这个问题。我在问题底部提到的两个问题与 yml 和属性文件之间的行为差​​异有关。
    • 我已经尽力了,先生! 问题 #1 询问 Java 转义字符 ...我知道(事实上)只有一个 Java 转义字符 - 那是反斜杠。 AND 唯一需要转义的字符是反斜杠本身和双引号。 问题 #2 - 我没有使用过 YML,也不知道 YML 解析器如何“执行”RegEx 解析。但是,如果 YML 使用其他某种 Reg-Ex 语言(其中有很多:POSIX、UNIX、PERL...)——我已经阐明了我非常了解的一种——Java 的 RegEx!能解释一下 YML RegEx 的不同之处吗?
    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多