【发布时间】: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) 成功。
现在,请有人解释一下:
- 为什么在 yml 的情况下,控制台输出显示 Java 相关的转义字符
- 为什么
=需要在 yml 中转义,而不是在属性中
【问题讨论】:
标签: java regex spring spring-boot yaml