正则表达式分组

 

正则表达式分组

 

 

 

分组可以分为两种形式,捕获组和非捕获组。


捕获组
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 (A)
3 (B(C))
4 (C)
组零始终代表整个表达式之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。
Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则)。 例如 ([" ']).* \1 其中使用了分组,\1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " ' " 或 ' " ' ,但是请注意,它并不会对" a'或者 'a"匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。

分组语法 捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)

 

非捕获组
以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。在Java中,支持的非捕获组,有如下几种:
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind 这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。
(?=X ) 零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!X) 零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配。
(?<=X) 零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?<!X) 零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配
(?:exp) 匹配exp,不捕获匹配的文本

 

运用

  比如有个超链接

    <p> 11-13   <a href=/bj/11/201/4969834.html target=_blank> 中介   -   2200元/1居   -   房屋出租,北辰附近   (亚运村)   </a>

  需要提取出href里面的内容,以及<a></a>部分包裹的内容

  

 1     public static void main(String[] args) {
 2         String reg = "(?<=<a\\shref=)(.*)(?:\\starget=.*>)(.*)(?=</a>)";
 3         String src= "<p> 11-13   <a href=/bj/11/201/4969834.html target=_blank> 中介   -   2200元/1居   -   房屋出租,北辰附近   (亚运村)   </a> ";
 4         Pattern pattern = Pattern.compile(reg);
 5         Matcher matcher = pattern.matcher(src);
 6         while (matcher.find()) {
 7             for (int i = 0; i <= matcher.groupCount(); i++) {
 8                 System.out.println(matcher.group(i));
 9             }
10 
11         }
12     }

 

运行上述代码输出

    /bj/11/201/4969834.html target=_blank> 中介   -   2200元/1居   -   房屋出租,北辰附近   (亚运村)   
    /bj/11/201/4969834.html
     中介   -   2200元/1居   -   房屋出租,北辰附近   (亚运村)

 

 

  

 

 

posted on 2012-08-29 16:35  云轩阁  阅读(534)  评论(0编辑  收藏  举报