Java 正则表达式匹配规则

   

()表示捕获分组()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)

(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来

*   0次或者多次, 匹配前面的子表式零次或多次

+   1次或者多次,匹配前面的子表达式一次或多次

?   0次或者1次,匹配前面的子表达式零次或一次  , 这个? 代表子表式可以忽略

\D 非数字

import java.util.regex.*;

public class Patternk {
    public static void main(String[] args)
    {

     // 按指定模式在字符串查找
        String line = "Thisk3900! OK?";
        String pattern1 = "This([0-9]+)?(\\D*)";

        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern1);

        // 现在创建 matcher 对象
        Matcher m = r.matcher(line);
        if (m.find( )) {
            int n = m.groupCount();
            System.out.println("count: " + n);
            System.out.println("group(): " + m.group());
            System.out.println("group(0): " + m.group(0));
            System.out.println("group(1): " + m.group(1));
            if(n > 1)
               System.out.println("group(2): " + m.group(2));
            if(n > 2)
               System.out.println("group(3): " + m.group(3)); 
        } else {
            System.out.println("NO MATCH");
        }

        boolean matche1 = m.matches();
        System.out.println("actualString = " + matche1);

  }
}



结果:

count: 2
group(): Thisk
group(0): Thisk
group(1): null
group(2): k
actualString = false

我们来解释这个匹配规则

String line = "Thisk3900! OK?";
String pattern1 = "This([0-9]+)?(\\D*)";

1. 首先匹配  This

2. 匹配 规则 ([0-9]+)? 为匹配 剩下的  "k3900! OK?" 字符串, 此时发现第一个字符为 k, 匹配失败,由于 匹配规则中有 ,所以这次可以忽略,

3. 匹配下一个规则  (\\D*) ,  匹配的字符仍然为"k3900! OK?" 字符串(因为规则2没有匹配成功,而且可以忽略)。 此时匹配到 “k”, 由于 “3” 是数字了,所以匹配结束。

因为匹配规则中有两个 () () 括号,即两个分组,所以有两个group, 第一个([0-9]+)? 没有匹配成功,所以group(1) = null,    第二个分组 (\\D*) 匹配到 k, 所以 group(2) = k.

4. boolean matche1 = m.matches();  这个matches() 函数 是全量匹配, 即所有字符串都要匹配上才算成功,   group(), group(0), 打印的就是匹配到的字符串,由于 "Thisk"  不等于"Thisk3900! OK?", 所有匹配不上。 结果为 false。

参考:

正则表达式之匹配优先与忽略优先_ StoriesWine-CSDN博客_正则表达式优先匹配

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值