匹配美国电话号码格式的Oracle正则表达式

3

Oracle正则表达式匹配以下格式的美国电话号码:

(NNN) NNN-NNNNNNN-NNN-NNNNNNNNNNNNNN

我已经尝试了以下正则表达式:

with test as
(
select '(444) 123-6780' as testcol from dual
union
select '444123-6780'                from dual
union
select '6741236780'                from dual
union
select '(445) 123-6781'            from dual
union
select '447-127-6787'            from dual
union
select '447-127-3333333333'            from dual
)
SELECT *
FROM test
WHERE REGEXP_LIKE(testcol, '^\(?\d{3}\)?([[:blank:]|-])?\d{3}-?\d{4}$');

结果:

(444) 123-6780  -- valid
(445) 123-6781  -- valid
444123-6780     -- not valid
447-127-6787    -- valid
6741236780      -- valid

如您所见,我收到了444123-6780NNNNNN-NNNN)格式的内容,但我不需要这种格式。

有没有办法阻止上述格式匹配?


2
有趣的是,您的所有数字都不是有效的北美电话号码,因为第一位和第四位数字不能是1。http://en.wikipedia.org/wiki/North_American_Numbering_Plan - David Aldridge
2个回答

1
REGEXP_LIKE(testcol,'^(\(\d{3}\))([[:blank:]])\d{3}-\d{4}$|^\d{3}(-)\d{3}(-)\d{4}$|^\d{10}$')

1
我曾以为可以用一个正则表达式字符串完成它 ;)... 但是由于 ([[:blank:]|-])?,之前的正则表达式将匹配格式为 NNNNNN-NNNN [444123-6780] 的字符串,这是不必要的。因此,我为每个格式制作了正则表达式字符串,并将它们进行了 OR 运算。 - user2018441

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接