目录
问题现象:
问题分析:
解决方法:
拓展:
1、手机号或座机:
2、邮箱:
3、中文:
4、数字:
5、英文:
6、组合:
问题现象:
今天在项目中,发现有个正则表达式匹配不上导致了数据校验不通过的问题,如下:
于是就产生了疑问:这个正则表达式有什么问题?校验手机号/座机号码的正则表达式到底该怎么写呢?
问题分析:
上面这个正则表达式是我用来校验用户传入的手机号和座机号。
根据这个问题就开始回想自己当初是怎么写出这个正则表达式的?关于正则表达式,不知道各位小伙伴是怎么学习的,反正我自己学的时候只会理解,从来不去记,因为这个东西我感觉用得很少,而且没有记的必要,只要在需要使用的时候,查一下资料复习一下就可以了,而更多的时候我可能只是上网搜一下校验某个字段(如手机号)的正则表达式该怎么写,所以当时就是上网搜到了这个正则表达式,然后也测过几组手机号和座机号,感觉没问题就搬过来了;现在看来是当初没有测试得全面,而且我根本没有认真去检查这个搬过来的正则表达式写得到底对不对,所以才导致了文章开头那个问题的产生,所以在这里还是要提醒一下大家:对待网上的资料一定要谨慎!!!
入正题:通过简单的复习了一下正则表达式,然后再来观察上面那个正则表达式,就会很容易发现问题了:
出错的正则表达式:
^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$|\\d{3}-\\d{8}|\\d{4}-\\{7,8}
分析示例:
当校验字符串为类似手机号、座机号的格式,是没有问题的:
13400009999
14500009999
15500009999
16200009999
17799990000
18899990000
19000009999
020-11800000
错误示例:
0750-22637456
原因很简单,其实就是因为正则表达式最后面那块错了:
\\{7,8}
因此,只要把它改成匹配7-8为数字即可。
解决方法:
将出错的正则表达式:
^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$|\\d{3}-\\d{8}|\\d{4}-\\{7,8}
改为:
^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$|\\d{3}-\\d{8}|\\d{4}-\\d{7,8}
区别在于:\\{7,8} 改为了 \\d{7,8}
拓展:
这里记录一下我们常见的一些正则表达式(不定期更新,亲测有效,如有误欢迎纠错):
1、手机号或座机:
^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$|\\d{3}-\\d{8}|\\d{4}-\\d{7,8}
2、邮箱:
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?
3、中文:
任意长度的中文字符:[\u4e00-\u9fa5]
固定长度的中文字符:^[\u4e00-\u9fa5]{指定长度}$
大于等于指定长度的中文字符:^[\u4e00-\u9fa5]{指定长度,}$
4、数字:
任意长度的数字:^[0-9]*$
固定长度的数字:^\d{指定长度}$
大于等于指定长度的数字:^\d{指定长度,}$
5、英文:
任意大小写字母:^[A-Za-z]+$
任意大写字母:^[A-Z]+$
任意小写字母:^[a-z]+$
6、组合:
任意英文、数字:^[A-Za-z0-9]+$
任意中文、数字:^[\u4e00-\u9fa50-9]+$
任意中文、英文:^[\u4e00-\u9fa5A-Za-z]+$
任意中文、英文、数字:^[\u4e00-\u9fa5A-Za-z0-9]+$