2

我正在编写一些正则表达式 + 查询来匹配美国电话号码。下面的负前瞻从正则表达式的角度得到验证,但由于不支持负前瞻,因此在 Oracle 中不起作用。谁能帮我修改查询以在 Oracle 中工作?

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

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

谢谢,安迪

4

2 回答 2

5
WHERE REGEXP_LIKE(phone, '^1?[2-9]\d{9}$') and not REGEXP_LIKE(phone, '^1?911')
于 2013-07-29T11:30:02.147 回答
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}$');
于 2018-07-24T21:57:04.577 回答