zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/bsjl/p/8669585.html
Copyright © 2011-2022 走看看