((A)(B(C)))/A(B(C))(C)
组零始终代表全副表白式
之因而这么命名捉拿组是因为在相称中,保留了与这些组相称的输入序列的每个子序列。捉拿的子序列稍后能够穿越 Back
引用在表白式中利用,也能够在相称垄断告终后从相称器检索。
Back 引用 是说在后面的表白式中我们能够利用组的编号来引用前面的表白式所捉拿到的文本序列(是文本不是正则)。
例如 ([" ']).* /1
其中利用了分组,/1即便对引号这个分组的引用,它相称包括在两个引号可能两个单引号中的所有字符串,如,"abc"
或 " '" 或 '"'
,然而请当心,它并不会对" a'可能
'a"相称。起因上面曾经解释,Back引用只是引用文本而不是表白式。
非捉拿组
以 (?) 开始的组是纯的非捉拿
组,它不捉拿文本,也不针对组协商举行计数。即便说,万一小括号中以?号开始,那么这个分组就不会捉拿文本,当然也不会有组的编号,因而也不存在Back
引用。
在Java中,扶持的非捉拿组,有如下几种:
(?=X)X,穿越零宽度的正
lookahead(?!X)X,穿越零宽度的负
lookahead(?<=X)X,穿越零宽度的正
lookbehind(?
lookbehind
这四个非捉拿组用于相称表白式X,然而不包括表白式的文本。
(?=X )零宽度正先行断言。仅当子表白式 X 在 此位置的右侧相称时才继续相称。例如,/w+(?=/d)
与后跟数字的单词相称,而不与该数字相称。此构造不会回溯。(?!X)零宽度负先行断言。仅当子表白式 X 不在
此位置的右侧相称时才继续相称。例如,例如,/w+(?!/d)
与后不跟数字的单词相称,而不与该数字相称。(?<=X)零宽度正后发断言。仅当子表白式 X 在
此位置的左侧相称时才继续相称。例如,(?<=19)99 与跟在 19 后面的 99
的实例相称。此构造不会回溯。(?
不在此位置的左侧相称时才继续相称。例如,(?
的实例相称
示例:
上面都是理论性的推荐,这里就利用一些例子来解释一下问题:
1、测验相称性 (?
这里的含义即便相称后面的文本56前面不能是4,后面定然是9构成。因而,能够相称如下文本 5569 ,与4569不相称。
2 、提取字符串
提取da12bka3434bdca4343bdca234bm提取包括在字符a和b之间的数字,然而这个a之前的字符不能是chttp://www11.119sos.net.dobbike.com,b后面的字符定然是d能力提取。
例如这里就只有3434这个数字中意要求。那么我们怎么提取呢?
率先我们写出提取这个字符串的表白式: (?
这里就只有一个捉拿组(/d+)
JAVA代码片断如下:
Patternp=Pattern.compile("(?
Matcherm=p.matcher("da12bka3434bdca4343bdca234bm");while(m.find()){
System.out.println(m.group(1)); //我们凡是捉拿组1的数字即可。收获
3434
System.out.println(m.group(0)); //
0组是全副表白式,看这里,并未曾提炼出(?
能够看到,非捉拿组,最后是不会归来收获的,因为它本身并不捉拿文本。
正则表白式功能其实极其壮大,这里只是对高级用法的容易摸索。有乐趣的朋友和本人共同谈论。不但不该当拒绝旁人的辩难,我们该当迎接旁人来觉察并指出我们的编程工作中的不足之处,
1
2
3
4