正则表达式选择并替换以清理美国电话号码

时间:2018-10-16 22:39:00

标签: regex mariadb

我们将电话号码列表作为数据馈送的一部分。它们都是针对北美公司的。我想删除任何前导“ 1”或“ +1”以及任何尾随信息,例如“ x100”,“ EXT400”等。它们存储在MariaDB中,所以我想这样做

UPDATE `CompanyPhone` SET `number`= REGEXP_SUBSTR(`number`,pattern)

要删除不需要的内容,我只需要使用REGEX来选择电话号码的正确部分。

"1 (555) 555-5555 x100" -> "(555) 555-5555"
"+15555555555 EXT400" -> "5555555555"
" 555-555-5555" -> "555-555-5555" (remove leading space)

基本上,我只需要前10位数字,如果它是1,则忽略第一位,如果可能的话,当前格式应使用前10位数字(“()”或“”或“-”)收下。

如果所有内容都可以重新格式化为(555)555-5555,那将是一个奖励,但不是必需的。如果需要,我可以进行第二次查询。

1 个答案:

答案 0 :(得分:1)

您可以为此使用REGEXP_REPLACE。假设您使用的是MariaDB 10.0.5或更高版本,则可以使用PCRE正则表达式。对于您的示例表达式,此正则表达式将为您提供所需的结果(demo on Regex101)。它会寻找3组数字(3位数字,3位数字然后是4位数字),这些数字可能以1开头,并在其周围带有其他非数字字符(例如+-)。

^(?:\D*)1?(?:\D*)(\d{3})(?:\D*)(\d{3})(?:\D*)(\d{4}).*$

因此您的UPDATE语句将变为

UPDATE `CompanyPhone` SET `number`= REGEXP_REPLACE(`number`, '^(?:\\D*)1?(?:\\D*)(\\d{3})(?:\\D*)(\\d{3})(?:\\D*)(\\d{4}).*$', '(\\1) \\2-\\3')