gpt4 book ai didi

java - 您能解释一下 Java 正则表达式中的这个命名组起始位置吗?

转载 作者:行者123 更新时间:2023-11-30 03:39:55 24 4
gpt4 key购买 nike

我陷入了一个奇怪的境地,试图匹配 Java (8) 正则表达式中的可选命名组。

例如,以下匹配按预期发生,并且断言不会引发错误:

Pattern pat = Pattern.compile("begin.+(?<middle>middle).+end");
Matcher matcher = pat.matcher("begin middle end");

assertTrue(matcher.find());
assertEquals(6, matcher.start("middle"));
assertEquals(12, matcher.end("middle"));

但是,如果我将正则表达式更改为

begin.+(?<middle>(middle)?).+end

matcher.start("middle") 返回 12,就好像匹配为空。

如果我将正则表达式更改为

begin.+(?<middle>middle)?.+end

matcher.start("middle") 返回 -1,就好像没有匹配一样。

我想知道 Java 中是否可以有可选的命名组。

我犯了什么错误?

最佳答案

它与命名组无关。

原因是begin之后的.+greedily匹配字符串“middle”。您的命名组不匹配任何内容(这是明确允许的)。

解决方案是使第一个 .+ non-greedy ,例如:

begin.+?(?<middle>(middle)?).+end

关于java - 您能解释一下 Java 正则表达式中的这个命名组起始位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27018136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com