捕获和非捕获
单纯说到捕获,他的意思是匹配表达式,但捕获通常和分组联系在一起,也就是“捕获组”。
捕获组:匹配子表达式的内容,把匹配结果保存到内存中数字编号或显示命名的组里, 以深度优先进行编号,之后可以通过序号或者名称来使用这些匹配结果。 |
根据命名方式的不同,又可以分为两组:
- 数字编号捕获组
语法:(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)); } }