Regexp_like vs regex validators онлайн - разные результаты

У меня есть регулярное выражение для проверки электронной почты с использованием plsql, которое доставляет мне некоторые головные боли ... :) Это условие, которое я использую для проверки электронной почты ([email protected]):

IF NOT REGEXP_LIKE (user_email, '^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$') THEN
            control := FALSE;
            dbms_output.put_line('EMAIL '||C.user_email||' not according to regex');
END IF;

Если я сделаю выбор на основе выражения, я тоже не получу никаких значений:

Select * from TABLE_X where REGEXP_LIKE (user_email, '^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$');

Используя regex101.com, я получаю полное совпадение с этим электронным письмом: [email protected]

Любая идея?


person Eunito    schedule 27.08.2019    source источник
comment
Кажется, что каждая реализация регулярных выражений отличается. Я не уверен, поддерживает ли Oracle классы обратной косой черты в стиле Perl в выражении скобок класса символов - возможно, вам придется использовать эквивалентные классы символов Posix (например, [: alnum:] вместо \ w). Вы не указываете, какую версию Oracle вы используете - поддержка регулярных выражений 11g описана здесь.   -  person Bob Jarvis - Reinstate Monica    schedule 27.08.2019


Ответы (1)


Синтаксис регулярных выражений, поддерживаемый Oracle: в документации.

Кажется, Oracle не понимает \w внутри []. Вы можете расширить это до:

with table_x (user_email) as (
  select '[email protected]' from dual
  union all
  select 'bad [email protected]' from dual
)
Select * from TABLE_X
where REGEXP_LIKE (user_email, '^[a-zA-Z_0-9.-]+@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|([a-zA-Z_0-9-]+.)+[a-zA-Z]{2,4})$');

USER_EMAIL            
----------------------
[email protected]

Вам не нужно экранировать . или - внутри квадратных скобок, это позволит сопоставить буквальные обратные косые черты.

Подобные требования возникали раньше - например, здесь - но вы, похоже, разрешаете октеты IP-адреса вместо полных доменных имен, заключенных в буквальные квадратные скобки, что необычно.

Как сказал @BobJarvis, вы также можете использовать [:alnum:], но все равно нужно будет включать подчеркивание. Это может позволить использовать не-ASCII «буквенные» символы, которых вы не ожидаете; хотя они могут быть действительными, как и другие исключенные вами символы; Вы, кажется, следуете «общему совету», упомянутому в этой статье.

person Alex Poole    schedule 27.08.2019
comment
Это решило проблему. Используя ваше предложение, я удалил побег из файла. в другом правиле проверки столбца для значений как Av. do Céu, используя ^ [a-zA-Z0-9 \ s.ãáàéèêíìóòúùÃÁÀÉÈÊÍÌÓÒÚÙ] + $ вместо ^ [a-zA-Z0-9 \ s \ .ãáàéèêíìóòúùÃÁÀÉÈÊÍÌÓÒÚÙ] + $, но я получаю аналогичную ситуацию. - person Eunito; 27.08.2019
comment
@Eunito - Я не думаю, что \s там тоже узнает Oracle. Может быть, [[:alnum:][:space:]]. заменит все это, в зависимости от вашего набора символов? - person Alex Poole; 27.08.2019
comment
использовал [: space:] вместо \ s и работал ... хм, проблема, похоже, заключается в побеге, как вы упомянули! Спасибо! - person Eunito; 27.08.2019
comment
Хороший. [: alnum:] может обрабатывать все эти акцентированные символы и немного упростить ситуацию. - person Alex Poole; 27.08.2019