正则表达式系列:
正则表达式1-提取手机号
正则表达式2-提取公司名、脱敏手机号(1)

上篇文章中,我们已成功地为公司名打上标记,现在我们来处理手机号。
分析:
 手机号要能有多个,而且分隔符不一样,所以我们的目标是去掉所有的分隔符,将各个手机号给隔开。

  • 标记手机号

1.png
在[查找目标]中输入:(1[3578]d{9})
[替换为]中输入:〖$1〗
给每一行的手机号前面加上〖,后面加上〗。

注意:公司名称的标记和手机号的标记不能相同。
  • 清除分隔符

2.png
在[查找目标]中输入:(〖d+〗)[,s]s*(〖d+〗)
[替换为]中输入:$1$2
规则文本释义:
[,s] 表示两个手机号中间肯定有1个逗号或空白字符。
s 在s后面,表示可能有0个或多个空白字符。
这里的空白字符不仅仅表示空格,还可以表示回车换行。在windows环境下,换行由两个字符组成,两个字符都是不可见字符,所以上面“北京信维计算机系统服务有限公司”中换行的手机号码也能匹配。
但“甘李药业股份有限公司”有三个手机号,当匹配完前两个手机号后,再从第三个手机号开始匹配,因缺乏第四个手机号,所以匹配失败。
要解决这个问题,只需要再执行相同的替换就可以了。
3.png

抽取公司名称,手机号

这一步是本次抽取的关键部分,有点小绕,其实并不难。
4.png
先要选择[匹配新行]。
什么意思呢? 就是把多行合并成一行,把换行符换成空格。
如:
原文:
5-1.png
匹配新行之后,系统将其转换为:
5-2.png

在[查找目标]中输入:【(.+?)】.+?((〖\d+〗)+)[^【]+
[替换为]中输入:$1$2rn
规则文本释义:
【(.+?)】 获得【】中的内容,也就是公司名称,合并成一个组,供替换规则文本使用,这里的?很重要。
? 表示非贪婪匹配,用来限制前面的+。

    举例:北京药业总公司海淀分公司
        .+公司   .会匹配:北京药业总公司海淀分
        .+?公司  .会匹配:北京药业总

因为已经选择了[匹配新行],整个文档只有一行,如果不加?,则开启了贪婪匹配,【(.+)】会一直匹配到最后一个公司的名称,即“裕融1090科技有限公司”。
.+? 公司名称与手机号码中间有其他字符相关,至少有空白字符,这里也要关闭贪婪匹配,否则也匹配到最后那个公司了。
((〖d+〗)+) (〖d+〗)表示匹配一个手机号码,这里〖〗符号不能脱去,否则后续不好处理。括号外面的+表示至少有一个,内层的括号不能去掉,否则就表示〗这个字符有多个了。最外层的括号表示这个组,供替换规则文本使用。
[^【]+ 表示后面匹配多个非【的字符。
方括号的用法:
6-1.png
6-2.png
加^表示取反,只要不是ab字符,就能匹配。

替换规则文本中的rn表示windows中的回车换行符。

  • 格式调整

接下来就比较简单了。
7.png
切换至普通模式。
在[查找目标]中输入:〗〖
[替换为]中输入:,
8.png
在[查找目标]中输入:〗
[替换为]中输入:(清空)
9.png
切换至扩展模式(支持制表符)。
在[查找目标]中输入:〖
[替换为]中输入:t

  • 脱敏手机号

万里长征只差最后一步了,加把劲!现在我们要将4-7位替换为*
10.png
在[查找目标]中输入:(1[3578]d)(d{4})(d{4})
[替换为]中输入:$1****$3
规则文本释义:
因为是手机号中段需要处理,所以手机号被分成了三个组。
(1[3578]d) 第1个组,也就是前3位
(d{4})(d{4}) 第2个组和第3个组
$1****$3 我们只取第1组和第3组,第2个组文本被扔了,用4个星号和第1,3组合并成新的文本。

如果您遇到了业务上的难题,欢迎留言或加QQ群319279669讨论。

标签: 技术, 业务, 正则表达式

添加新评论