代码之家  ›  专栏  ›  技术社区  ›  Saptarshi Basu

正则表达式在Spring Boot YML中

  •  0
  • Saptarshi Basu  · 技术社区  · 6 年前

    我有一个Spring Boot Web应用程序:

    在application.properties中,我有一个值为regex的属性:

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

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

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

    在controller方法中打印,然后使用以下命令编译:

    Pattern.compile(regex)
    

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

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

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

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

    请注意regex是完全相同的。

    控制台输出现在是:

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

    以及 Pattern.compile(regex) 投掷 java.util.regex.PatternSyntaxException: Illegal character range near index 16

    现在,我逃离了 = 在regex中为:

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

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

    ^[A-ZA-Z0-9()\-\\=\*\.\\?\\|;,+\\/:&“]*$
    

    pattern.compile(正则表达式) 是成功的。

    现在,请有人解释一下:

    1. 为什么在YML的情况下,控制台输出显示与Java相关的转义字符。
    2. 为什么? = 需要在yml中转义,但不能在属性中转义
    1 回复  |  直到 6 年前
        1
  •  0
  •   user9654671    6 年前

    好,

    我几乎每周五天都在使用正则表达式——差不多一年了。

    弗斯特 ,我100%肯定地知道,左括号和右括号是正则表达式编译器希望看到转义的控制字符:

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

    注意,我在括号前加了一个反斜杠。不是所有的正则表达式编译器都是相同的,但是我在Java中使用的编译器可能希望它们能逃脱。

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

    如果运行并读取yml的正则表达式解析器 文件不是由Java编译器首先编译的,那么 不需要 双重逃跑 (转义转义字符-也就是 “反斜杠”)。相反,在 表达。