捕获
捕获组: 我们匹配子表达式的内容,并把匹配结果(以数字编号或组名的方式)保存到内存中,之后可以通过序号或名称来使用这些匹配结果。
而根据命名方式的不同,又可以分为两种组:
数字编号捕获
语法:(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 |
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HelloWorld {
public static void main(String []args) {
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));
}
}
}
}
/*
分组的个数有:2
第0个分组为:020-85653333
第1个分组为:020
第2个分组为:85653333
*/
分组个数为 2,第0个为整个表达式本身。
命名编号捕获组
语法:(?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 |
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HelloWorld {
public static void main(String []args) {
String test = "020-85653333";
String reg="(?<quhao>0\\d{2})-(?<haoma>\\d{8})";
Pattern pattern = Pattern.compile(reg);
Matcher mc= pattern.matcher(test);
if(mc.find()){
System.out.println("分组的个数有:"+mc.groupCount());
System.out.println(mc.group("quhao"));
System.out.println(mc.group("haoma"));
}
}
}
/*
分组的个数有:2
020
85653333
*/
非捕获组
语法:(?:exp)
解释: 和捕获组刚好相反,它用来标识那些不需要捕获的分组。
比如上面的正则表达式,程序不需要用到第二个分组,那就可以这样写:
(0\\d{
2})-(?:\\d{
8})
序号 | 编号 | 分组 | 内容 |
---|---|---|---|
0 | 0 | (0\d{2})-(\d{8}) |
020-85653333 |
1 | 1 | (0\d{2}) |
020 |
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HelloWorld {
public static void main(String []args) {
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));
}
}
}
}
/*
分组的个数有:1
第0个分组为:020-85653333
第1个分组为:85653333
*/