Oracle Regex替换负面预测

时间:2013-07-29 11:18:44

标签: regex oracle

我正在编写一些正则表达式+查询以匹配美国电话号码。具有负前瞻的下一个从正则表达式角度进行验证,但由于不支持负前瞻而在Oracle中不起作用。任何人都可以帮我修改查询以在Oracle中工作吗?

select 'match' from dual WHERE REGEXP_LIKE('16665555555', '^1?(?!911)[2-9][0-9]{9}$');

它不会为oracle中的任何数字返回匹配。

谢谢, 安迪

2 个答案:

答案 0 :(得分:5)

WHERE REGEXP_LIKE(phone, '^1?[2-9]\d{9}$') and not REGEXP_LIKE(phone, '^1?911')

答案 1 :(得分:0)

我认为公认的答案是做到这一点的最好,最清晰的方法。但是,仅供参考,针对这种情况的另一种选择是将您希望的对前三个字符的限制(在可选的“ 1”之后)组合起来,并使用替代来覆盖所有可能的情况。

在这种情况下,我们可以用三种可能性覆盖前三个字符(在可选的“ 1”之后)的所有可能的允许情况:

  1. 字符匹配“ [2-9] [0-9] {2}” ,并且第一个字符不是为9。这种情况可以写为:“ [2-8] [0-9] {2}”
  2. 字符匹配“ [2-9] [0-9] {2}” ,并且第一个字符 9,但是第二个字符是不是 1.这种情况可以写为:“ 9 [02-9] [0-9]”
  3. 字符匹配“ [2-9] [0-9] {2}” ,并且第一个字符 9 ,并且第二个字符 1,但第三个字符不是 1.这种情况可以写为:“ 91 [02-9]”

将所有内容放在一起,我们得到:

select 'match' from dual WHERE REGEXP_LIKE('9115555555', '^1?([2-8][0-9]{2}|9[02-9][0-9]|91[02-9])[2-9][0-9]{6}$');