我正在尝试在大型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)
答案 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)
<强>详情:
^
- 字符串开头(?: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
- 使用连字符:
- 或者XXX-$4-$5
- XXX
(或国家/地区代码),第4组和第5组用连字符分隔。)
- if-then
阻止结束。答案 1 :(得分:1)
我不熟悉powershell,但是为你做一个小脚本是个好主意。
对于记事本方法,我尝试运行替换两次:
查找:(?:^|,)(\d{3})[ -]?(\d{4})(?:,|$)
REPLACE :XXX-\1-\2
其中XXX是您的输入区域代码
查找:\(?1?\(?(\d{3})\)?[ -]?(\d{3})[ -]?(\d{4})
更换:\1-\2-\3
我认为订单不重要。首先在测试文件中试一试。
我不确定你的第二个问题是什么意思,正则表达式是从csv中的错误列中选择数字吗? (如果是这样,那么脚本会更好的另一个原因)