【问题标题】:oracle regular expression to format phone numberoracle正则表达式格式化电话号码
【发布时间】:2018-08-24 05:25:13
【问题描述】:

我想使用 case 语句和正则表达式组合来格式化以下格式的电话号码

+1 (111) 111-1111111-111-1111

并且当第一个大括号(c)之后的位数不等于 10 时,则 null else 按原样填充

能否请您提供一些有用的 Oracle 正则表达式函数来处理这个问题

谢谢

【问题讨论】:

  • 我不知道源格式是什么,他想要的格式是什么。
  • 这是否意味着数字总是有一对括号?如果输入的格式已经是 343-999-3333 怎么办?
  • 这是一个很好的问题,如果输入已经是预期的格式,我必须填充相同的值。如果是 343-999-3333 输出应该是 343-999-3333
  • 好的,让我们重新表述这个问题。您可以使用太多数字的无效电话号码吗?例如:一种方法可能是计算数字(同时忽略其他所有内容)。如果总数少于 10 位,则返回 NULL。否则,只需根据模型 111-111-1111 格式化最后十个 DIGITS。这对你有用吗?正如您现在提出的问题,(111) 111-1111 将保持原样,不会转换为 111-111-1111。这就是你想要的吗?
  • 另外 - 你的电话号码可以有分机吗?例如,111-111-1111 分机。 2348?或者您是否有单独的扩展字段? (这将是更好的方法。)

标签: sql regex oracle


【解决方案1】:

例如:

SQL> with test (col) as
  2    (select '+2 (123) 123-4433' from dual union all -- convert
  3     select '22 (23)234-443'    from dual union all -- do not convert
  4     select '-3 (123) 345 2343' from dual union all -- do not convert
  5     select '123 345 565'       from dual union all -- do not convert
  6     select '+c (334) abc-1234' from dual           -- do not convert
  7    )
  8  select col,
  9         case when regexp_like(col, '\+\d \(\d{3}\) \d{3}-\d{4}') then
 10                   replace(substr(col, 5, length(col)), ') ','-')
 11              else col
 12         end result
 13  from test;

COL               RESULT
----------------- ----------------------------------------------------
+2 (123) 123-4433 123-123-4433
22 (23)234-443    22 (23)234-443
-3 (123) 345 2343 -3 (123) 345 2343
123 345 565       123 345 565
+c (334) abc-1234 +c (334) abc-1234

SQL>

【讨论】:

  • 感谢@Littlefoot 的快速响应。我正在查看数据,我看到一些像 +1 5735 这样的奇怪数字。我想忽略它。其实让我修改一下我的问题。
  • @user1751356 - 如果您的问题(修改后)与您最初发布的问题不同,最好用新问题开始另一个线程,而不是修改已经基于答案的问题关于原始问题。
【解决方案2】:

您不需要CASE 表达式。您可以使用REGEXP_REPLACE 并尝试匹配整个字符串。如果找到匹配项,则使用反向引用将数字重新格式化为新模型。如果未找到匹配项,则按原样返回输入字符串。

with test (col) as
  (select '+2 (123) 123-4433' from dual union all -- convert
   select '22 (23)234-443'    from dual union all -- do not convert
   select '-3 (123) 345 2343' from dual union all -- do not convert
   select '123 345 565'       from dual union all -- do not convert
   select '+c (334) abc-1234' from dual           -- do not convert
  )
select col,
       regexp_replace(col, '^\+\d \((\d{3})\) (\d{3}-\d{4})$', '\1-\2') result
from   test
;

COL               RESULT              
----------------- --------------------
+2 (123) 123-4433 123-123-4433        
22 (23)234-443    22 (23)234-443      
-3 (123) 345 2343 -3 (123) 345 2343   
123 345 565       123 345 565         
+c (334) abc-1234 +c (334) abc-1234 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2014-02-15
    • 2019-05-30
    相关资源
    最近更新 更多