使用Notepad ++ Regex格式化电话号码

时间:2016-09-13 22:31:20

标签: regex csv notepad++

我正在尝试在大型CSV目录中格式化电话号码。我需要定期重新格式化,因为它不会改变,所以这不是一次性的解决方案。我以前成功使用过Notepad ++的正则表达式替换功能,如果可能的话我想使用这个工具。但是,我对更好/更快的方法持开放态度,包括像PowerShell这样的脚本,我很熟悉。

数据库中数字格式的示例
XXX-XXXX
XXXXXXX
XXXXXXXXXX
1XXXXXXXXXX
(XXX)XXX-XXXX
1(XXX)XXX-XXXX
(1XXX)XXX-XXXX
XXX-XXX-XXXX

最后一个是我希望所有电话号码在最终输出中看起来像。对于缺少区号的那个,我会添加一个默认值。对于那些有额外国家代码的人,我需要截断它。

以下是我使用的一些正则表达式搜索:
发现:1-(\d{3})-(\d{3})-(\d{4})
更换:\ 1- \ 2- \ 3
这有效!

发现:1\((\d{3})\)\s(\d{3})-(\d{4})
更换:\ 1- \ 2- \ 3
这有效!

发现:(\d{11})
更换:??? 这会找到正确的字符串,但我不知道如何格式化输出。

发现:(\d{3})-(\d{4})
REPLACE:XXX- \ 1- \ 2(这里XXX是我要添加的标准区号)
这会在XXX-XXX-XXXX中找到正确的子字符串以及附加了+4的XXX-XXXX和邮政编码(XXXXX-XXXX)。需要找到XXX-XXXX,而不是前面的任何内容,只需要找到电话号码。由于这是一个CSV文件,因此每个字段前的实际字符是逗号。

我的问题是双重的。 1)我不知道如何将找到的字符串分解为替换所需的部分。我需要转换数字块(7,10和11位)并格式化它们以适应模式XXX-XXX-XXXX。 2)我不知道如何只选择我正在搜索的字符串(即只有XXX-XXXX)

2 个答案:

答案 0 :(得分:4)

如果你有一个像

这样的数字样本列表
Current             Expected
---------------------------------
123-1234            XXX-123-1234
1234567             XXX-123-4567
1234567890          123-456-7890
10123456789         012-345-6789
(123) 456-1234      123-456-1234
1(123) 123-1234     123-123-1234
1-123-123-1234      123-123-1234
(1999) 999-1234     999-999-1234
123-123-1234        123-123-1234

您可以使用

查找内容^(?:1-?)?(?|\(1?(\d{3})\)|(\d{3}))[-\s]?(\d{3})[-\s]?(\d{4})$|^(\d{3})[-\s]?(\d{4})$
替换为(?1$1-$2-$3:XXX-$4-$5)

enter image description here

<强>详情:

  • ^ - 字符串开头
  • (?:1-?)? - 1和可选-
  • 的可选序列
  • (?|\(1?(\d{3})\)|(\d{3})) - 分支重置组(语法为(?|...),备用分支内的所有组都接收相同的ID)匹配:
    • \(1?(\d{3})\) - ( +可选1 +第1组,共3位数字+ )
    • | - 或
    • (\d{3}) - 第1组(仍然是!因为分支重置组)捕获3位数
  • [-\s]? - 1或0(可选)-或空白
  • (\d{3}) - 第2组捕获3位数字
  • [-\s]? - 可选的-或空白
  • (\d{4}) - 第3组抓取4位数字
  • $ - 行尾
  • | - 或
  • ^ - 行首
  • (\d{3}) - 第4组捕获3位数字
  • [-\s]? - 可选的-或空白
  • (\d{4}) - 第5组捕获4位数字
  • $ - 行尾

替换模式

  • (?1 - 如果第1组匹配,则使用
    • $1-$2-$3 - 使用连字符
    • 反向引用第1,2和3组
  • : - 或者
  • XXX-$4-$5 - XXX(或国家/地区代码),第4组和第5组用连字符分隔。
  • ) - if-then阻止结束。

答案 1 :(得分:1)

我不熟悉powershell,但是为你做一个小脚本是个好主意。

对于记事本方法,我尝试运行替换两次:

  1. 查找(?:^|,)(\d{3})[ -]?(\d{4})(?:,|$)

    REPLACE XXX-\1-\2其中XXX是您的输入区域代码

  2. 查找\(?1?\(?(\d{3})\)?[ -]?(\d{3})[ -]?(\d{4})

    更换\1-\2-\3

  3. 我认为订单不重要。首先在测试文件中试一试。

    我不确定你的第二个问题是什么意思,正则表达式是从csv中的错误列中选择数字吗? (如果是这样,那么脚本会更好的另一个原因)