У меня есть веб-приложение Spring Boot:
В application.properties у меня есть это свойство, значением которого является регулярное выражение:
mytest.regex=^[a-zA-Z0-9()\\-=\\*\\.\\?\\|;,+\\/:&_ \"]*$
Я вставляю это в контроллер, как показано ниже:
@Value("${mytest.regex}")
private String regex;
и распечатайте в методе контроллера, а затем скомпилируйте, используя:
Pattern.compile(regex)
Он успешно компилируется без каких-либо исключений и печатает строку ниже в консоли (обратите внимание на связанные с Java escape-символыis not is output):
^[a-zA-Z0-9()\-=\*\.\?\|;,+\/:&_ "]*$
Теперь я заменяю файл application.properties на application.yml.Содержимое файла теперь выглядит следующим образом:
mytest:
regex: ^[a-zA-Z0-9()\\-=\\*\\.\\?\\|;,+\\/:&_ \"]*$
Обратите внимание, что регулярные выражения точно такие же.
Теперь вывод консоли:
^[a-zA-Z0-9()\\-=\\*\\.\\?\\|;,+\\/:&_ \"]*$
и Pattern.compile(regex)
throws java.util.regex.PatternSyntaxException: Illegal character range near index 16
Теперь я экранирую =
в регулярном выражении в виде:
^[a-zA-Z0-9()\\-\\=\\*\\.\\?\\|;,+\\/:&_ \"]*$
Вывод консоли: (Обратите внимание, что в отличие от файла свойств, escape-символы, связанные с Java, все еще там):
^[a-zA-Z0-9()\\-\\=\\*\\.\\?\\|;,+\\/:&_ \"]*$
и Pattern.compile(regex)
успешно.
Теперь, пожалуйста, кто-нибудь может объяснить:
- Почему в случае yml вывод консоли показываетЭкранирующие символы, связанные с Java
- Почему
=
необходимо экранировать в yml, а не в свойствах