更高效校验手机号

850 阅读2分钟

本人在做性能测试过程中,发现代码中存在一个校验手机的方法,用的是正则匹配的模式。代码如下:

    public static boolean isTel(String tel) {
        Pattern p = Pattern.compile("^[1][3,4,5,6,7,8,9][0-9]{9}$");
        Matcher m = p.matcher(tel);
        return m.matches();
    }

咋一看没啥问题,但是仔细看最后用到了matches这个方法,此方法用于完全匹配才会返回true,因为正则表达式中已经才用了行首和行尾的标记,其实这个用matches()方法和find()方法差不太多,find其实也可以。这种情况下性能差异忽略。

其实这里的校验比较简单,使用正则并不是最好的方式,因为正则非常耗时,经过本机测试,正确的手机匹配需要耗时30+ms,虽然很短,但是每次请求都校验一次的代价全是非常大的,经过一些尝试,终于找到了一个更高效的检验方法。如下:

static boolean isTel(String tel) {
        try {
            def of = Long.valueOf(tel)
            if (of >= 13000000000 && of <= 19000000000)
                return true
        } catch (Exception e) {
            return false
        }
    }

经过测试,该方法需要5-6ms就能搞定。

技术类文章精选

非技术文章精选

大咖风采

长按关注