我正在尝试使用Oracle正则表达式来格式化我们的电话号码。
我必须使用以下条件
请参阅以下所有4种情况的示例
+(555) --> NULL
1112223333 --> 111-222-3333
+1 (123) 1111111 x1111 --> 123-111-1111
(111)1111111 Ext. 1111 --> 111-111-1111
(111) 111-1111 ext 1111 --> 111-111-1111
2 111-111-1111 --> 211-111-1111
感谢您的帮助。
答案 0 :(得分:0)
最简单的方法(不使用正则表达式):
translate()
去除非数字字符substr()
减少到十位数substr()
重新格式化所以:
with cte as
( select substr (
translate ( phone
, '1234567890' || phone
, '1234567890'
) , 1, 10 ) as clean_phone
from your_table
)
select case
when length(clean_phone) = 10 then
substr(clean_phone, 1, 3)
||'-'||
substr(clean_phone, 4, 4)
||'-'||
substr(clean_phone, 7, 4)
else null end as fmt_phone
from cte
答案 1 :(得分:0)
我使用了嵌套SQL。
在最内部的步骤中,尝试使用regexp_replace
和substr
来消除加号后的数字和所有非数字字符,
,然后使用format model
作为 to_char 函数的参数转换为所需的格式,如下所示:
select (case when length(str_)<10 then null
else
replace(to_char(substr(str_,1,10),'fm999,999,9999'),',','-')
end)
as str
from
(
select (case when substr(str,1,1)='+' then
regexp_replace(substr(str,3,length(str)),'[^0-9]','')
else
regexp_replace(str,'[^0-9]','')
end) as str_
from tab
);
答案 2 :(得分:0)
REGEXP_REPLACE(phone,'^(+?1[.[:space:]-])?(?(\d{3})(\d*).*','\2-\3')