[疯狂Java]正则表达式:捕获组、反向引用、捕获组命名
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,dd是2,然后再接着累加地对命名捕获组编号,因此<date>是3;
- 上一篇: 几款C#开源的测试工具
- 下一篇: 【C#编程最佳实践 十三】接口测试实践