为什么 Oracle SQL 函数 regexp_substr 没有返回所有匹配的字符?

Why is Oracle SQL function regexp_substr not returning all matching characters?

任何人(在正则表达式匹配方面具有丰富的经验)能否为我解释为什么以下查询 returns(我认为)在 Oracle 12 中出现意外结果?

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

预期结果:测试@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:]+ 结果也是一样的。 我很好奇为什么它不匹配@符号前后的所有非白色space字符。以及为什么有时它匹配 1 个字符,有时匹配 2 个或 3 个或更多字符,但不是全部。

您的 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;

它给出了您预期的结果。

您尝试使用的 POSIX 快捷方式不正确,需要用方括号括起来:

SELECT REGEXP_SUBSTR('Beneficiary email: super+test.media.beneficiary1@gmail.com', '[^@[:space:]]+@[^@[:space:]]+') 
FROM dual;

或更简单,假设您只想通过检查“@”来验证,并且电子邮件地址始终位于字符串的末尾,在最后一个 space:

之后
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, '.* (.*@.*)', '')
from tbl
;

注意:如果未找到匹配项,REGEXP_REPLACE() 将 return 原始字符串,其中 REGEXP_SUBSTR() 将 return NULL。请记住这一点,并相应地处理未找到的匹配项。总是期待意外!