复习下Java正则表达式的捕获组和非捕获组

问题的提出:

比如有下面一段代码:
<a href="11"> <font color="21">aaa </font> </a>
<a href="12"> <font color="22">bbb </font> </a>
<a href="13">ccc </a>
<a href="14"> <font color="24">ddd </font> </a>
<a href="15"> <font color="25">eee </font> </a>
<a href="16">fff </a>

上面的代码意思是 <font color="***">和 </font>不一定有,而且color的值也可能不一样
我现在想得到
aaa
bbb
ccc
ddd
eee
fff

这个正则表达式该怎么写?谢谢 】

我的解答:(未使用非捕获组,借用了String方法的replaceAll)

 

package  test1;
import  java.util.regex. * ;
public   class  Test6

    
public   static   void  main(String[] args)
    { 
        String s
= " <a href="11"> <font color="21">aaa </font> </a>  "
                
+ " <a href="12"> <font color="22">bbb </font> </a>  "
                
+ " <a href="13">ccc </a>  "
                
+ " <a href="14"> <font color="23">ddd </font> </a> "  
                
+ " <a href="15"> <font color="25">eee </font> </a>  "
                
+ " <a href="16">fff </a>  " ;
        String regex
= " <a.*?>(.*?)</a> " ;
         
        Pattern pt
= Pattern.compile(regex);
        Matcher mt
= pt.matcher(s);
        
while (mt.find())
        {
            System.out.println(mt.group(
1 ).replaceAll( " <font.*?>|</font> " "" ).trim());
        }
    } 

解答二:使用非捕获组

 

package  test1;
import  java.util.regex. * ;
 
public   class  Test6  {
    
public static void main(String[] args) {
        String str 
= "<a href="11"> <font color="21">aaa </font> </a>" +
                     
"<a href="12"> <font color="22">bbb </font> </a>" +
                     
"<a href="13">ccc </a> " +
                     
"<a href="14"> <font color="23">ddd </font> </a>" +
                     
"<a href="15"> <font color="25">eee </font> </a> " +
                     
"<a href="16">fff </a> ";
        String regex 
= "<a.*?>(?:/s*<font[^>]*>)?(.*?)(?:</font>/s*)?</a>";
        Pattern pattern 
= Pattern.compile(regex);
        Matcher matcher 
= pattern.matcher(str);
        
while(matcher.find()) {
            System.out.println(matcher.group(
1));
        }

    }

}

 

总结:什么是非捕获组、什么是捕获组. ----------引自帮助文档

组和捕获

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

1     ((A)(B(C)))
2     /A
3     (B(C))
4     (C)

组零始终代表整个表达式。

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器获取。

与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串 "aba" 与表达式 (a(b)?)+ 相匹配,会将第二组设置为 "b"。在每个匹配的开头,所有捕获的输入都会被丢弃。

以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。

 

你可能感兴趣的:(java,c,正则表达式,String,文档,regex)