正则表达式在Oracle中找到并避免双点

时间:2017-10-23 11:21:08

标签: regex oracle

我试图找到双点,如果在任何电子邮件中连续出现双点,它应该提示我" NO"

DECLARE 
v_email webowner.person.email%TYPE;
v_constant CONSTANT VARCHAR2(300) := '^(([a-zA-Z0-9"_\-])([a-zA-Z0-9_\.\/%+="''\-]*[a-zA-Z0-9])@(\[((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}|((([a-zA-Z0-9\-]+)\.)+))([a-zA-Z]{2,}|(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\]))$';
BEGIN
  v_email := 'test_sample@mercer.com';
if regexp_like(v_email, v_constant) then

  pl('YES: ' || v_email);
else
  pl('NO: ' || v_email);
end if;
END; 

注意:双点表示连续点,并且在#34之前需要检查双点的存在; @"

尝试使用Regex that does not allow consecutive dots

找不到正确的正则表达式。

请帮助。

2 个答案:

答案 0 :(得分:1)

我的直接想法是检查“..”的索引是否小于“@”的索引,并且第一个索引不是-1。

SELECT
    CASE WHEN INSTR(v_email, '..') BETWEEN 1 AND INSTR(v_email, '@') - 1
         THEN 'dots present'
         ELSE 'no dots' END AS dots
FROM yourTable;

我希望这对你有所帮助:)。

答案 1 :(得分:0)

更改此部分:

([a-zA-Z0-9_\.\/%+="''\-]*[a-zA-Z0-9])

对此:

((\.?[a-zA-Z0-9_\/%+="''\-]+)*\.?[a-zA-Z0-9])

所以基本上,如果有任何匹配的点,它们必须穿插一些非点,可接受的字符。这样你永远不会匹配两个连续的。