Почему Oracle SQL функция regexp_substr не возвращает все совпадающие символы? - PullRequest
1 голос
/ 14 июля 2020

Может ли кто-нибудь (с большим опытом сопоставления регулярных выражений) пояснить, почему следующий запрос возвращает (что я считаю) неожиданные результаты в Oracle 12?

select regexp_substr('My email: test@tes6t.test', '[^@:space:]+@[^@:space:]+') 
from dual;

Ожидаемый результат: test@tes6t.test

Фактический результат: t@t

Другой пример:

select regexp_substr('Beneficiary email: super+test.media.beneficiary1@gmail.com', '[^@:space:]+@[^@:space:]+') 
from dual;

Ожидаемый результат: super + test.media. beneficiary1@gmail.com

Фактический результат: ry1@gm

РЕДАКТИРОВАТЬ: я дважды проверил, и это не связано с Oracle SQL, но такое же поведение применимо к любому механизму регулярных выражений. Даже при упрощении регулярного выражения до [^: space:] + @ [^: space:] + результаты такие же. Мне любопытно узнать, почему он не соответствует всем непробельным символам до и после знака @. И почему иногда он соответствует 1 символу, иногда 2 или 3 или более символам, но не всем.

Ответы [ 2 ]

3 голосов
/ 14 июля 2020
• 1000 адрес всегда находится в конце строки после последнего пробела:
WITH tbl(str) AS (
  SELECT 'My email: test@tes6t.test' FROM dual UNION ALL
  SELECT 'Beneficiary email: super+test.media.beneficiary1@gmail.com' FROM dual
)
SELECT REGEXP_REPLACE(str, '.* (.*@.*)', '\1')
from tbl
;

Примечание: REGEXP_REPLACE() вернет исходную строку, если совпадение не найдено, где REGEXP_SUBSTR() вернет NULL. Имейте это в виду и обрабатывайте не найденные совпадения соответственно. Всегда ожидайте неожиданного!

0 голосов
/ 14 июля 2020

REGEX неверен в вашем коде SQL. Попробуйте

select regexp_substr('Beneficiary email: super+test.media.beneficiary1@gmail.com', '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b') 
from dual;

select regexp_substr('My email: test@tes6t.test', '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b') 
from dual;

Это даст ожидаемый результат.

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