Regex в Spring Boot YML - PullRequest
       6

Regex в Spring Boot YML

0 голосов
/ 14 октября 2018

У меня есть веб-приложение 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) успешно.

Теперь, пожалуйста, кто-нибудь может объяснить:

  1. Почему в случае yml вывод консоли показываетЭкранирующие символы, связанные с Java
  2. Почему = необходимо экранировать в yml, а не в свойствах

1 Ответ

0 голосов
/ 14 октября 2018

Ну,

Я работаю с регулярными выражениями практически пять дней в неделю - уже почти год.

Сначала , я знаю со 100% уверенностью, что открывающая и закрывающая скобки являются управляющими символами, которые компилятор регулярных выражений ожидал бы увидеть экранированными:

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

Обратите внимание, я добавил обратную косую черту перед скобками.Не все компиляторы регулярных выражений созданы равными, но тот, который я использую в Java, вероятно, хотел бы избежать их.

Второй, Компилятор Java и Компилятор регулярных выражений Java (встроенный в Java) тоже не одно и то же.Единственная причина, по которой вам нужно «экранировать управляющий символ» (включая двойной обратный слеш ), заключается в том, что компилятор языка Java компилируетсякод first и компилятор регулярных выражений Java (Run-Time) запускается second .

Если анализатор Regular-Expression, который работает, ичтение файла YML сначала не компилируется компилятором Java, тогда вам не нужно будет дважды экранировать (экранирующий символ - он же обратный слеш).Вместо этого используйте в своем выражении только один символ обратной косой черты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...