Java正则表达式——分组与捕获

对于要重复的单个字符,非常简单,直接在字符后加上限定符即可,例如a+标识匹配1个或一个以上的a, a?标识0个或这1个a。a{n,}标识X至少n次。
但是我们要对多个字符进行重复该怎么办呢?此时我们要用到分组,我们可以使用小括号”()”来指定要重复的子表达式,然后对这个子表达式进行重复。

分组分为2种形式,捕获组和非捕获组

捕获组

捕获组可以通过从左到右计算其开括号来编号,在表达式((A)(B(C)))中,存在这样的组:

  • 1 ((A)(B(C)))
  • 2 \A
  • 3 (B(C))
  • 4 (C)

组零始终代表整个表达式。

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。

非捕获组

以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。

在Java中,支持的非捕获组,有如下几种:

  • (?=X)  X,通过零宽度的正 lookahead
  • (?!X)  X,通过零宽度的负 lookahead
  • (?<=X)   X,通过零宽度的正 lookbehind
  • (?<X)  X,通过零宽度的负 lookbehind

举例:

测试匹配性 (?<!4)56(?=9) 这里的含义就是匹配后面的文本56前面不能是4,后面必须是9组成。因此,可以匹配如下文本 5569 ,与4569不匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值