[疯狂Java]正则表达式:捕获组、反向引用、捕获组命名

来源:互联网 发布:js 如何取list 编辑:程序博客网 时间:2024/04/27 22:24

1. 捕获组及其编号:

    1) 捕获组之前讲过,就是匹配到的内容,按照()子表达式划分成若干组;

    2) 例如正则表达式:(ab)(cd(ef))就有三个捕获组,没出现一对()就是一个捕获组

    3) 捕获组编号规则:

         i. 引擎会对捕获组进行编号,编号规则是左括号(从左到右出现的顺序,从1开始编号;

         ii. 例如:



2. 反向引用:

    1) 捕获组的作用就是为了可以在正则表达式内部或者外部(Java方法)引用它;

    2) 如何引用?当然是通过前面讲的用捕获组的编号来引用咯!

    3) 正则表达式内部引用:

         i. \X:X是一个十进制数,X的范围必须落在捕获组编号范围之内,该表达式就匹配X号捕获组所匹配到的内容;

         ii. 从上面的描述可以看出,\X匹配的内容是必须X号捕获组匹配成功之后才能确定的!

         iii. 例如:([ab])\1,匹配aabbcc的结果是aa和bb,\1的内容必须要让1号捕获组捕获后才能确定,如果1号捕获的是a那么\1就是a,1号捕获到了b那么\1就是b;

    4) 正则表达式外部引用:就是用Matcher对象的start、end、group查询匹配信息时,使用捕获组编号对捕获组引用(int group);


3. 捕获组命名:

    1) 如果捕获组的数量非常多,那都用数字进行编号并引用将会非常混乱,并且难以记忆每个捕获组的内容及意义,因此对捕获组命名显得尤为重要;

    2) Java 7开始提供了对捕获组命名的语法,并且可以通过捕获组的名称对捕获组反向引用(内外都行);

         i. 命名捕获组的语法格式:(?<自定义名>expr)

         ii. 例如:(?<year>\d{4})-(?<date>\d{2}-(?<day>\d{2}))

             a. 有三个命名捕获组year、date和day

             b. 从左到右编号分别为1、2、3(编号同样是有效的)

    3) 命名捕获组的反向引用:

        i. 正则表达式内引用:\k<捕获组名称>

!例如:(?<year>\d{4})-\k<year>可以匹配1999-1999

        ii. 外部引用:Matcher对象的start、end、group的String name参数指定要查询的捕获组的名称;


4. 普通捕获组和命名捕获组的混合编号:

    1) 普通捕获组是相对命名捕获组的,即没有显式命名的捕获组;

    2) 当所有捕获组都是命名捕获组时那么编号规则和原来相同,即按照左括号(的出现顺序来编号;

    3) 当普通捕获组和命名捕获组同时出现时,编号规则为:先不忽略命名捕获组,只对普通捕获组按照左括号顺序编号,然后再对命名捕获组从左往右累计编号,例如:


!先忽略命名命名捕获组<date>,先对普通捕获组编号\d{4}是1,\d\d是2,然后再接着累加地对命名捕获组编号,因此<date>是3;

0 0