今天在做运营商标签,其中通话和短信两部分标签需要区分手机号码和非手机号码,并且还要考虑手机号码前面的0086、86等前缀。
首先考虑到手机号码验证最方便的就是正则表达式,于是整理了一份最新的手机号码验证的正则表达式。
以下是三大运营商的号段分布:
*移动号段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
* 联通号段: 130,131,132,145,155,156,170,171,175,176,185,186
* 电信号段: 133,149,153,170,173,177,180,181,189
由三大运营商的号段分布的出正则表达式:
regex = "^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8]))[0-9]{8}$"
有了正则表达式,核心问题就解决了,然后考虑去掉0086和86等前缀的问题,这里利用字符串的截取方法slice(),从最后一位开始,往前截取11位。
最终的代码如下:
def isMobileNumber(number: String): Boolean ={
val regex = "^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8]))[0-9]{8}$".r
val length = number.length
regex.findFirstMatchIn(number.slice(length-11,length)) != None
}
欢迎关注我的公众号——数据杨公子。本公众号会分享包括但不限于大数据、数据治理、元数据管理、python 等方面的技术文章,主旨是和大家一起共同成长,用技术来认识我们这个数据的时代。