JAVA正则表达式-捕获组与非捕获组

Java捕获组与非捕获组的问题

先看例子:

 1 import java.util.regex.Matcher;  
 2 import java.util.regex.Pattern;  
 3 
 4 public class PatternTest {  
 5     public static void main(String[] args) {  
 6         String text = "<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>";  
 7         String reg = "<textarea.*?>.*?</textarea>";  
 8         Pattern p = Pattern.compile(reg);  
 9         Matcher m = p.matcher(text);  
10         while (m.find()) {  
11             System.out.println(m.group());  
12         }  
13     }  
14 
15 }  

运行结果:

<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea> 

现在,如果我只想匹配到内的文本内容即“nexus maven repository index properties updating index central”,怎么做呢?这时候就要用到捕获组了。上述代码中“

 1 import java.util.regex.Matcher;  
 2 import java.util.regex.Pattern;  
 3 
 4 public class PatternTest {  
 5     public static void main(String[] args) {  
 6         String text = "<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>";  
 7         //下面的正则表达式中共有四个捕获组:(<textarea.*?>)、(.*?)、(</textarea>)和整个匹配到的内容  
 8         String reg = "(<textarea.*?>)(.*?)(</textarea>)";    
 9         Pattern p = Pattern.compile(reg);  
10         Matcher m = p.matcher(text);  
11         while (m.find()) {  
12             System.out.println(m.group(0)); // 整个匹配到的内容  
13             System.out.println(m.group(1)); // (<textarea.*?>)  
14             System.out.println(m.group(2)); // (.*?)  
15             System.out.println(m.group(3)); // (</textarea>)  
16         }  
17     }  
18 }  

运行结果:

1 <textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>  
2 <textarea rows="20" cols="70">  
3 nexus maven repository index properties updating index central  
4 </textarea>  

从上述代码得出结论:正则表达式中每个”()”内的部分算作一个捕获组,每个捕获组都有一个编号,从1,2…,编号0代表整个匹配到的内容。
  

至于非捕获组,只需要将捕获组中”()”变为”(?:)”即可,代码说话:

 1 import java.util.regex.Matcher;  
 2 import java.util.regex.Pattern;  
 3 
 4 public class PatternTest {  
 5 
 6     public static void main(String[] args) {  
 7         String text = "<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>";  
 8         // 下面的正则表达式中共有二个捕获组:(.*?)和整个匹配到的内容,两个非捕获组:(?:</textarea>)和(?:<textarea.*?>)  
 9         String reg = "(?:<textarea.*?>)(.*?)(?:</textarea>)";  
10         Pattern p = Pattern.compile(reg);  
11         Matcher m = p.matcher(text);  
12         while (m.find()) {  
13             System.out.println(m.group(0)); // 整个匹配到的内容  
14             System.out.println(m.group(1)); // (.*?)  
15         }  
16     }  
17 }  

运行结果:

1 <textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>  
2 nexus maven repository index properties updating index central  

如果试图运行:System.out.println(m.group(2));将会抛出异常,因为不存在编号为2的捕获组。

  

还有方便的写法 (<textarea.*?>)(?<data>.*?)(</textarea>) 在正则表达式中加一个变量 data 然后在 group 获取 string str = m.group(“data”);

.*? 在这里是非贪婪模式,即最短匹配,比如说字符串 aabab,什么都不加,默认贪婪模式,a.*b 能匹配abab,非贪婪模式,加?号,a.*?b能匹配aab和ab;

原文地址:https://www.cnblogs.com/bsjl/p/8669585.html