正则表达式-分组
转载:http://blog.csdn.net/mutouyihao/article/details/7042160 正则表达式在字符串处理中经常使用,关于正则简单的用法相信有一点程序基础的人都懂得一些,这里就不介绍简单基础了。这里主要讲解一下在JAVA中实现了的正则的高级用法-分组与捕获。 对于要重复单个字符,非常简单,直接在字符后卖弄加上限定符即可,例如 a+ 表示匹配1个或一个以上的a,a?表示匹配0个或1个a。这些限定符如下所示:
但是我们如果要对多个字符进行重复怎么办呢?此时我们就要用到分组,我们可以使用小括号"()"来指定要重复的子表达式,然后对这个子表达式进行重复,例如:(abc)? 表示0个或1个abc 这里一个括号的表达式就表示一个分组。
分组可以分为两种形式,捕获组和非捕获组。
捕获组 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式((A)(B(C)))中,存在四个这样的组:
组零始终代表整个表达式 之所以这样命名捕获组是为了在匹配中,用来保存与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。
Back 引用 是说在后面的表达式中 我们可以使用组的编号来引用 前面的表达式所捕获到的文本序列(是文本不是正则)。
例如 ([" ']).* /1 其中使用了分组,/1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " '" 或 '"' ,但是请注意,它并不会对" a'或者 'a"匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。
非捕获组 以(?)开头的组是纯的非捕获组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。 在Java中,支持的非捕获组,有如下几种:
这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。
举例:
上面都是理论性的介绍,这里就使用一些例子来说明一下问题: 1、测试匹配性 (?<!4)56(?=9) 这里的含义就是匹配后面的文本56前面不能是4,后面必须是9组成。因此,可以匹配如下文本 5569 ,与4569不匹配。
2 、提取字符串 提取da12bka3434bdca4343bdca234bm提取包含在字符a和b之间的数字,但是这个a之前的字符不能是c,b后面的字符必须是d才能提取。
例如这里就只有3434这个数字满足要求。那么我们怎么提取呢? 首先我们写出提取这个字符串的表达式: (?<!c)a(/d+)bd 这里就只有一个捕获组(/d+) JAVA代码片段如下:
可以看到,非捕获组,最后是不会返回结果的,因为它本身并不捕获文本。 (?:
(pattern )是捕获型括号。
(?<name> pattern )
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |