Убедитесь, что регулярное выражение совместимо с Posix - PullRequest
1 голос
/ 23 апреля 2020

Я хотел бы знать, есть ли способ проверить, является ли регулярное выражение совместимым с Posix, используя Java.

Я использую MySQL 5.7 версию и Я не могу используйте"нормальные" регулярные выражения с функцией REGEXP:

MySQL использует реализацию регулярных выражений Генри Спенсера, которая нацелена на соответствие POSIX 1003.2. MySQL использует расширенную версию для поддержки операций сопоставления с образцом регулярных выражений в операторах SQL.

Если я попытался использовать некоторые из этих токенов, например:

  • \w
  • \d
  • (?:

Они считаются недействительными или просто игнорируются MySQL. Возможно, есть и другие.

Я знаю, что класс Java Pattern можно использовать для проверки правильности регулярного выражения, используя:

Pattern.compile(regex);

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

1 Ответ

1 голос
/ 23 апреля 2020

Синтаксис, такой как \w, \d, (?:) поддерживается в Perl совместимых регулярных выражениях (PCRE), а не в POSIX. Такие инструменты, как egrep, поддерживают расширенные функции для совместимости, но это не делает их POSIX.

Со страницы руководства для re_format (7) :

РАСШИРЕННЫЕ ФУНКЦИИ

Когда флаг REG_ENHANCED передается одному из вариантов regcomp (), активируются дополнительные функции. Как и расширенные реализации регулярных выражений в языках сценариев, таких как perl (1) и python (1), эти дополнительные функции могут конфликтовать со стандартами IEEE Std 1003.2 (`` POSIX.2 '') в некоторых отношениях. Используйте это с осторожностью в ситуациях, когда требуется переносимость (в том числе в прошлые версии Ma c OS X с использованием предыдущей реализации регулярных выражений).

Существует различие между «расширенным» и «расширенным». Расширенный относится к уровням функций регулярного выражения POSIX. Расширенный означает синтаксис, поддерживаемый PCRE, но не POSIX.

В синтаксисе POSIX вы можете делать многие вещи:

  • Для \w , используйте [[:alnum:]_].

  • Для \d используйте [[:digit:]].

  • Синтаксис (?:) не нужен, поскольку MySQL REGEXP не поддерживает захват групп в любом случае. Вы можете просто использовать () для группировки.

Я не думаю, что необходимо использовать валидатор Java для анализа ваших регулярных выражений. Вы должны быть в состоянии прочитать документацию и использовать только те функции, которые появляются в c.

Я имею в виду, что синтаксис регулярных выражений не так уж и сложен. Вы можете создать краткий справочный лист на заметке Post-It.

...