任何人(在正则表达式匹配方面具有丰富经验的人)都可以为我澄清为什么以下查询在Oracle 12中返回(我认为)意外结果吗?
select regexp_substr('My email: [email protected]', '[^@:space:]+@[^@:space:]+')
from dual;
预期结果:[email protected]
实际结果:t @ t
另一个例子:
select regexp_substr('Beneficiary email: [email protected]', '[^@:space:]+@[^@:space:]+')
from dual;
预期结果:[email protected]
实际结果:ry1 @ gm
编辑:我仔细检查过,这与Oracle SQL不相关,但是相同的行为适用于任何正则表达式引擎。即使将正则表达式简化为[^:space:] + @ [^:space:] +,结果也相同。我很好奇知道为什么它与@符号前后的所有非空白字符都不匹配。为何有时它匹配1个字符,而有时却匹配2个或3个或更多字符,但不是全部。
您尝试使用的POSIX快捷方式不正确,您需要在方括号中加上以下方括号:
SELECT REGEXP_SUBSTR('Beneficiary email: [email protected]', '[^@[:space:]]+@[^@[:space:]]+')
FROM dual;
甚至更简单,假设您只想通过检查'@'进行验证,并且电子邮件地址始终在字符串的末尾,最后一个空格之后:
WITH tbl(str) AS (
SELECT 'My email: [email protected]' FROM dual UNION ALL
SELECT 'Beneficiary email: [email protected]' FROM dual
)
SELECT REGEXP_REPLACE(str, '.* (.*@.*)', '\1')
from tbl
;
注意:REGEXP_REPLACE()
如果找不到匹配项,REGEXP_SUBSTR()
将返回原始字符串,其中将返回NULL。请记住这一点,并处理找不到相应的匹配项。永远期待意外!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句