付费文章Excel练习题函数公式职场模板 财务应用财务分析及图表表格合并RPA财务机器人一本不正经学会骗图表及可视化表格美化漂亮3D新手避坑指南快捷键符号作用生成序列条件格式数据整理筛选技巧日期时间偷懒宝典Office 365Power QueryWPS技巧PPT技巧Word技巧实用软件正则表达式

👇点击查看最近五篇原创文章👇

龙逸凡的Excel视频课程

需求

现在要编制一个公式,判断手机号中是否包含连续数字(顺子),含正序或倒序

 注意:

手机号之间并没有空格,为了方便查看,上图用自定义格式显示为每4位一组。

正序的连续数字

在以前的文章:

5句话,让你的正则表达式水平突飞猛进!(第3-5句)

中介绍过,(?=XX)的意思是“右边是XX”

比如,我们要匹配“2左边的1”【1的右边是2】,正则表达式这样写:

1(?=2)

用它可匹配数字“13156127”中的第3个1。

同理,我们要匹配到顺子,需要符合以下正则:

2(?=3)

或者

3(?=4)

或者

……

8(?=9)

我们知道,在正则表达式中用竖线“|”表示“或”的意思,所以用“|”将上面的正则拼接起来:

“1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)”

试一下看看匹配的效果

可以看到,他成功的匹配了5和1

but,我不只是要匹配5和1,而是要匹配56和12啊

简单!

如何判断手机号中是否有连续数字(顺子)?

咱们再完善一下:

  1. 先用一个括号,将上面的正则括起来,表明这是一个整体。

  2. 然后在这个整体后面加一个d,将后面的数字也匹配上。

完美!

继续完善

输入几个不同的数据测试一下

存在以下问题

  1. 01没做为顺序数字

  2. 234567分成两个一组

第1个问题的解决方案:加一个0(?=1)

第2个问题的解决方案:需要设置数量为{2,}

完整的正则公式为:

=REGEXP(B3,”(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2,}d”)

注意:

连续数字(顺子)是要求是3个以上的数字。这里的数量为什么不是用{3,}【3个以上】,而是用{2,}【2个以上】。

因为正则“0(?=1)”的意思是0右边是1,已经隐含要求有两个数字了。

(0(?=1)|1(?=2)|……){2,}相当于已经要求是3个以上的数字。

倒序的连续数字

上面介绍的是如何匹配顺序的连续数字,那要求匹配倒序的连续数字的正则表达式,就很容易写出来了

公式:

=REGEXP(B3,”((9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2,})d”)

同时匹配顺序、倒序的连续数字

公式:

=REGEXP(B4,”((0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2,}|(9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2,})d“)

如果使用上面的公式,当手机号中既没有顺序的连续数字,也没有倒序的连续数字时会出错。

得加入容错机制:当没有连续数字时显示为空

具体的解决方案及知识点,

详见收以前的文章:

从一个案例看正则表达式的优化技巧②:如何避免出错

从一个案例看正则表达式的优化技巧③:如何避免出错【补充】

最终,完整的公式:

=REGEXP(B4,”.+?K((0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2,}|(9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2,})d|^“)