java 正则表达式中,matcher.matches() 和 matcher.find()相互影响

java 正则表达式中,matcher.matches() 和 matcher.find()相互影响。

测试在.find()之后,用.group()把find到的值取出来。

先看一个例子

    @Test
    public void testReg() {
        Pattern pattern = Pattern.compile("\\d{11}");
        Matcher matcher = pattern.matcher("13188889999我的手机号");

        boolean b = matcher.find(); //返回 true
        System.out.println("b = " + b);// b = true
        String group = matcher.group(); // 返回 13188889999
        System.out.println("group = " + group); // group = 13188889999

        boolean matches = matcher.matches(); // 返回false 
        System.out.println("matches = " + matches); // matches = false
    }


    @Test
    public void testReg2() {
        Pattern pattern = Pattern.compile("\\d{11}");
        Matcher matcher = pattern.matcher("13188889999我的手机号");

        boolean matches = matcher.matches(); // 返回false
        System.out.println("matches = " + matches); // matches = false

        boolean b = matcher.find(); //返回 false
        System.out.println("b = " + b);// b = false
        String group = matcher.group(); // 报错 : java.lang.IllegalStateException: No match found
        System.out.println("group = " + group); // 未到达
    }

结论:

在使用.find()之前,如果没有用过.matches(),那么可以正常返加手机号码。但是如果在使用.find()之前,就使用过一次.matches(),那么不论.matches()的结果是true还是false,都不会再得到手机号了,原因是调用.matches()相当于同时也调用一次.find(),那么.matches()之后再用.find()就相当于第二次.find()了。

以下更清楚地表达这个意思:

    @Test
    public void testReg2() {
        Pattern pattern = Pattern.compile("\\d{11}");
        Matcher matcher = pattern.matcher("13188889999我的手机号,13222222222这是她的手机号。");

        boolean matches = matcher.matches(); // 返回false
        System.out.println("matches = " + matches); // matches = false

        boolean b = matcher.find(); //返回 true
        System.out.println("b = " + b);// b = true
        String group = matcher.group(); // 返回 : 13222222222
        System.out.println("group = " + group); // group = 13222222222
    }

说明

选用了一次.matches()之后,再用一次.find(),那么会返回第二个手机号码。第一个手机号码去哪里了呢?不好意思,被前面的.matches()吃掉了。

我们再看一个例子

    @Test
    public void testReg2() {
        Pattern pattern = Pattern.compile("\\d{11}");
        Matcher matcher = pattern.matcher("13188889999我的手机号,13222222222这是她的手机号。");

        boolean b = matcher.find(); //返回 true
        System.out.println("b = " + b);// b = true
        String group = matcher.group(); // 返回 : 13188889999
        System.out.println("group = " + group); // group = 13188889999

        boolean b2 = matcher.find(); //返回 true
        System.out.println("b2 = " + b2);// b = true
        String group2 = matcher.group(); // 返回 : 13222222222
        System.out.println("group2 = " + group2); // group = 13222222222

        boolean matches = matcher.matches(); // 返回false
        System.out.println("matches = " + matches); // matches = false
    }

说明

开始的时间不使用.matches(),第一次使用.find()可以返回第一个手机号,第二次使用.find()则会返回第二个手机号。

接下来我们把.matches()再移到上面去看看:

    @Test
    public void testReg2() {
        Pattern pattern = Pattern.compile("\\d{11}");
        Matcher matcher = pattern.matcher("13188889999我的手机号,13222222222这是她的手机号。");

        boolean matches = matcher.matches(); // 返回false
        System.out.println("matches = " + matches); // matches = false

        boolean b = matcher.find(); //返回 true
        System.out.println("b = " + b);// b = true
        String group = matcher.group(); // 返回 : 13222222222
        System.out.println("group = " + group); // group = 13222222222

        boolean b2 = matcher.find(); //返回 false
        System.out.println("b2 = " + b2);// b = false
        String group2 = matcher.group(); // 报错 : java.lang.IllegalStateException: No match found
        System.out.println("group2 = " + group2); // 未到达
    }

说明

使用.matches()之后,第一次.find()会返回手机号,但是返回的不是第一个手机号,而第二个手机号。为什么呢?因为第一个手机号被.matches()吃掉了。所以只能返回第一个手机号了。那么,第二次使用.find()就没有手机号可以返回了,只能报错了。

最后说明一下

.matches()是完全匹配,要整个字符与表达式表达的一模一样才行。而.find()是部分匹配,字符串内能截取出多少段符合表达式的小串,就能一次次地逐个逐个把它们find出来

    @Test
    public void testReg3() {
        Pattern pattern = Pattern.compile("\\d{11}");
        Matcher matcher = pattern.matcher("13188889999");

        boolean matches = matcher.matches(); // 返回true
        System.out.println("matches = " + matches); // matches = true
        String group = matcher.group(); // 返回13188889999,整个字符串与表达式一模一样,不多不少才行。
        System.out.println("group = " + group); // group = 13188889999
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值