手机号正则表达式校验
背景
前一段时间在用蜂巢取快递的时候,我输入199号段,发现提示我手机号错误,导致我无法注册使用蜂巢功能。
最近有空了,打算写一篇关于手机号校验的文章,和大家交流交流。现在网上的正则很多已经失效了,大家在项目中使用正则去校验的时候,一定要多注意,验证下正则的正确性,
避免在项目中出现因为正则的问题导致的用户体验问题。
手机号码格式
纯手机号格式:
- (+86) 199 0000 1715
- (+0086) 199 0000 1715
- (+86) 199-0000-1715
- (+86) 199-0000-1715
- (+86) 199-0000-1715
- +86 199-0000-1715
- +86199-0000-1715
- +86 199 0000 1715
- 86 199 0000 1715
- +8619900001715
- 8619900001715
- 199-0000-1715
- 199 0000 1715
- 19900001715
代码示例
我觉得我们只考虑1开头的11位数字即可。正则如下
const regExp = /(^|\s*\+?0?0?86|\D)(1\d{2})[-\s]{0,3}(\d{4})[-\s]{0,3}(\d{4})(?=\D|$)/;
const mobile="(+86) 199 0000 1715";
let result;
//使用match函数,我们可以这样写
result = mobile.match(regExp);
if(result){
console.log(result[2]+result[3]+result[4])
}
//使用replace函数,我们可以这样写
const regExp2 = /(.*?)(^|\s*\+?0?0?86|\D)(1\d{2})[-\s]{0,3}(\d{4})[-\s]{0,3}(\d{4})(?=\D|$)/;
result = mobile.replace(regExp2,"$3$4$5");
if(result.length===11){
console.log(result)
}
//js可以用双斜杠来简写正则,其他的语言可以这样写
new RegExp("(.*?)(^|\\s*\\+?0?0?86|\\D)(1\\d{2})[-\\s]{0,3}(\\d{4})[-\\s]{0,3}(\\d{4})(?=\\D|$)")
结束语
欢迎补充。