为了账号安全,请及时绑定邮箱和手机立即绑定

为什么捕获组中的标志会删除该组?

为什么捕获组中的标志会删除该组?

慕运维8079593 2021-08-04 10:37:29
在下面的代码中,(?i:hot)是一个捕获组。或者至少它应该是......它匹配表达式并使用字符。但是,当我尝试获取组数时,它返回 0。Pattern pattern = Pattern.compile("(?i:hot)");Matcher matcher = pattern.matcher("hot diggity dog");while (matcher.find()) {    int groupCount = matcher.groupCount(); // returns 0    for (int i = 0; i <= groupCount; i++) {        System.out.printf("%d. %s%n", i, matcher.group(i));    }}括号确实捕获。如你所见,如果我们这样做matcher.replaceAll("cold")它会返回“cold diggity dog”我希望 (?i:hot) 等价于 ((?i)hot),但事实并非如此。后一种情况是捕获组。这不是Java RegEx Matcher.groupCount 返回 0的重复,因为在那个问题中,确实没有捕获组,因此 groupCount 正确返回 0。但是在我的情况下,这确实应该被视为捕获组,因为它确实执行捕获!
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

它在文档中是正确的:

(?idmsux-idmsux: X )   X,作为具有给定标志 idmsux on - off的非捕获组

如果你想要一个捕获组,只需将它包装在另一组括号中:

((?i:hot))


查看完整回答
反对 回复 2021-08-04
?
慕斯709654

TA贡献1840条经验 获得超5个赞

我希望(?i:hot)相当于((?i)hot),但事实并非如此。后一种情况是捕获组。


一旦看到同一级别的右括号,几乎所有正则表达式引擎都会关闭内联修饰符。因此,除了捕获部分之外,以上两者都是等效的。


第一种语法完全是另一回事。


模式修改跨度

括号不应该表示捕获组或非捕获组,但它们可以将不同的功能带入可能捕获或不捕获的使用中。紧跟在问号之后的所有左括号对正则表达式引擎都有特殊含义:


(?...)

标志i是一个修饰符。修饰符可以在正则表达式上下文之外启用,但一些正则表达式引擎支持内联修饰符的语法,这使您能够在正则表达式本身内启用它们。因此单词inline:


(?i)test(?-i)

 ^        ^

 E        D

在另一方面有被称为另一个类似的语法模式改性跨度:(?modifiers:...)其类似于非捕获组(?:...)具有某些改性剂之间?和:,并将其应用于只以包围的子表达式:


(?i:test)

有了这样说,无论是(?i)test(?-i)和(?i:test)是相等的。此功能应该启用/禁用修饰符。时期。


我们不期望它有更多功能。


查看完整回答
反对 回复 2021-08-04
  • 3 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信