求助帮看个正则Bug,求解

问题描述

写了个正则匹配,对手机号码过滤靓号级别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正则能过滤掉,请高手指点!

阅读 1.9k
2 个回答

你这个的问题不仅仅是匹配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}$";

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题