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

WPS产品体验官
添加图片注释,不超过 140 字(可选)
需求
现在要编制一个公式,判断手机号中是否包含连续数字(顺子),含正序或倒序
添加图片注释,不超过 140 字(可选)
注意:
手机号之间并没有空格,为了方便查看,上图用自定义格式显示为每4位一组。
添加图片注释,不超过 140 字(可选)
正序的连续数字
在以前的文章:
中介绍过,(?=XX)的意思是“右边是XX”
比如,我们要匹配“2左边的1”【1的右边是2】,正则表达式这样写:
1(?=2)
用它可匹配数字“13156127”中的第3个1。
添加图片注释,不超过 140 字(可选)
同理,我们要匹配到顺子,需要符合以下正则:
2(?=3)
或者
3(?=4)
或者
……
8(?=9)
我们知道,在正则表达式中用竖线“|”表示“或”的意思,所以用“|”将上面的正则拼接起来:
"1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)"
试一下看看匹配的效果
添加图片注释,不超过 140 字(可选)
可以看到,他成功的匹配了5和1
添加图片注释,不超过 140 字(可选)
but,我不只是要匹配5和1,而是要匹配56和12啊
简单!
咱们再完善一下:
先用一个括号,将上面的正则括起来,表明这是一个整体。
然后在这个整体后面加一个\d,将后面的数字也匹配上。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
完美!
添加图片注释,不超过 140 字(可选)
继续完善
输入几个不同的数据测试一下
添加图片注释,不超过 140 字(可选)
存在以下问题
01没做为顺序数字
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")
添加图片注释,不超过 140 字(可选)
注意:
连续数字(顺子)是要求是3个以上的数字。这里的数量为什么不是用{3,}【3个以上】,而是用{2,}【2个以上】。
因为正则“0(?=1)”的意思是0右边是1,已经隐含要求有两个数字了。
(0(?=1)|1(?=2)|……){2,}相当于已经要求是3个以上的数字。
添加图片注释,不超过 140 字(可选)
倒序的连续数字
上面介绍的是如何匹配顺序的连续数字,那要求匹配倒序的连续数字的正则表达式,就很容易写出来了
公式:
=REGEXP(B3,"((9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2,})\d")
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
同时匹配顺序、倒序的连续数字
公式:
=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")
添加图片注释,不超过 140 字(可选)
如果使用上面的公式,当手机号中既没有顺序的连续数字,也没有倒序的连续数字时会出错。
得加入容错机制:当没有连续数字时显示为空
具体的解决方案及知识点,
详见收以前的文章:
最终,完整的公式:
=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|^")
添加图片注释,不超过 140 字(可选)
本文收录于正则表达式合集,欢迎订阅,免费的
WPS产品体验官
WPS产品体验官