zoukankan      html  css  js  c++  java
  • java正则表达式(九)

    九、后向引用

    在正则表达式中,后向引用用于重复搜索前面某个分组匹配的文本,例如,\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>匹配失败!

     

  • 相关阅读:
    模块cv2的用法
    调整弹出对话框在ASP.NET应用程序的大小
    xaf 自定义登陆页
    xaf 修改主页logo
    显示一个列表视图图表
    双击直接编辑状态
    xaf 富文本框添加方法
    用户 'NT AUTHORITYIUSR' 登录失败
    C# 中的INotifyPropertyChanged
    线程间操作无效: 从不是创建控件“txtreceive”的线程访问它。
  • 原文地址:https://www.cnblogs.com/loritin/p/2740197.html
Copyright © 2011-2022 走看看