正则表达式——捕获和非捕获

 


 
 

  

捕获

捕获组: 我们匹配子表达式的内容,并把匹配结果(以数字编号或组名的方式)保存到内存中,之后可以通过序号或名称来使用这些匹配结果。

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

数字编号捕获

语法:(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
*/

运行结果

猜你喜欢

转载自blog.csdn.net/qq_43448856/article/details/126332879