问题描述
写了个正则匹配,对手机号码过滤靓号级别AAAA
的号码.可以匹配出来,但是也碰到了BUG。
- 正则:^(?=d*(d)(d)(d)1$)1[35789]\d{9}$
-
验证号码
- 17091217777 --> true
- 17097777297 --> true
- 17091217297 --> true
- 17091217298 --> false
实在没想明白17091217297这个号码为何为true
代码
@Test
public void AAAA(){
String phoneNo = "17091217297";
String pattern = "^(?=\\d*(\\d)(\\d)(\\d)\\1$)1[35789]\\d{9}$";
matchRule(phoneNo, pattern);
}
private void matchRule(String phoneNo, String pattern) {
Pattern pa = Pattern.compile(pattern);
Matcher ma = pa.matcher(phoneNo);
Assert.assertTrue(ma.matches());
}
期望
期望17091217297
正则能过滤掉,请高手指点!
你这个的问题不仅仅是匹配
17091217297
错误,其实还有很多错误的比如17097077297
也会错误,其实应该写成这样就好了String pattern = "^(?=\\d*(\\d)\\1\\1\\1\\d*$)1[35789]\\d{9}$";
其实还有一个笨办法,就是把所有重复4个的都标识出来,比如:
String pattern = "^(?=\\d*(0000|1111|2222|3333|4444|5555|6666|7777|8888|9999)\\d*)1[35789]\\d{9}$";