九、后向引用
在正则表达式中,后向引用用于重复搜索前面某个分组匹配的文本,例如,\1代表分组1匹配的文本,同理, \2 将匹配第二个子表达式,\3 将匹配第三个,依此类推,难以理解?请看示例:
在以下一段html文本中:
<BODY>
<H1>Welcome to my Homepage</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
</BODY>
我们需要把<H1></H1>等这种段落标签,都匹配出来,如何实现呢?我们可以利用反向引用来进行匹配,反向引用匹配正则表达式如下:
<[hH]([1-6])>.*?</[hH]\1>
结合上节所讲内容,([1-6])加上了括号,成为了子表达式,在我们整个正则表达式中,模式的最后部分是“\1”,即子表达式的后向应用,因此,当([1-6])匹配到了1-6的任意数字时,那么“\1”也将匹配之前出现的数字,代码示例如下:
1 package regexp; 2 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 public class Test { 7 public static void main(String[] args) { 8 String s="<BODY>"+ 9 "<H1>Welcome to my Homepage</H1>"+ 10 "Content is divided into two sections:<BR>"+ 11 "<H2>ColdFusion</H2>"+ 12 "Information about Macromedia ColdFusion."+ 13 "<H2>Wireless</H3>"+ 14 "Information about Bluetooth, 802.11, and more."+ 15 "</BODY>"; 16 String reg="<[hH]([1-6])>.*?</[hH]\\1>"; 17 18 Pattern patt=Pattern.compile(reg); 19 Matcher mc=patt.matcher(s); 20 21 while(mc.find()){ 22 System.out.println(mc.group().trim()); 23 } 24 25 /** 26 * 输出: 27 * <H1>Welcome to my Homepage</H1> 28 * <H2>ColdFusion</H2> 29 */ 30 } 31 }
注:<H2>Wireless</H3>并未匹配成功,因为,在([1-6])进行匹配时,所匹配的数字为2,那么,后向应用的数字也应为2,但是这里</H3>标签,最后数字为3,因此,后向匹配不成功,所以
<H2>Wireless</H3>匹配失败!