捕获和非捕获

单纯说到捕获,他的意思是匹配表达式,但捕获通常和分组联系在一起,也就是“捕获组”。

捕获组:匹配子表达式的内容,把匹配结果保存到内存中数字编号或显示命名的组里,

以深度优先进行编号,之后可以通过序号或者名称来使用这些匹配结果。

根据命名方式的不同,又可以分为两组:

  • 数字编号捕获组

语法:(exp)

解释:从表达式左侧开始,每出现一个左括号和它对应的右括号之间的内容为一个分组,在分组中,第0组为整个表达式,第一组开始为分组。

比如固定电话的:020-85653333

它的正则表达式为:(0\d{2})-(\d{8})

序号 编码 分组 内容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 1 (0\d{2}) 020
2 2 (\d{8}) 85653333

我们用代码来验证:

String regex = "(0\\d{2})-(\\d{8})";
    String text = "020-85653333";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    if (matcher.find()) {
        System.out.println("分组个数:" + matcher.groupCount());
        for (int i = 0; i <= matcher.groupCount(); i++) {
        System.out.println("第" + i + "个分组为:" + matcher.group(i));
        }
    }

分组个数:2
第0个分组为:020-85653333
第1个分组为:020
第2个分组为:85653333

 

 

  • 命名编号捕获组

语法:(?<name>exp)

解释:分组的命名由表达式中的name指定

比如号码也可以这样写:(?<quhao>\0\d{2})-(?<haoma>\d{8})

序号 名称 分组 内容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 quhao (0\d{2}) 020
2 haoma (\d{8}) 85653333

 

String regex = "(?<quhao>0\\d{2})-(?<haoma>\\d{8})";
    String text = "020-85653333";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    if (matcher.find()) {
        System.out.println("分组个数:" + matcher.groupCount());
        System.out.println(matcher.group("quhao"));
        System.out.println(matcher.group("haoma"));
    }
  •  非捕获组

语法:(?:exp)

解释: 和捕获组刚好相反,它用来标识那些不需要捕获的分组

比如上面的正则表达式,程序不需要用到第一个分组,那就可以这样写:(?:0\d{2})-(\d{8})

String test = "020-85653333";
    String reg = "(?:0\\d{2})-(\\d{8})";
    Pattern pattern = Pattern.compile(reg);
    Matcher mc = pattern.matcher(test);
    if (mc.find()) {
        System.out.println("分组的个数有:" + mc.groupCount());
        for (int i = 0; i <= mc.groupCount(); i++) {
        System.out.println("第" + i + "个分组为:" + mc.group(i));
        }
    }

 

posted @ 2018-10-19 18:24  橘右京  阅读(505)  评论(0编辑  收藏  举报