你能在Java正则表达式中解释这个命名组的起始位置吗?

时间:2014-11-19 13:32:18

标签: java regex

我在这里陷入了一种奇怪的境地,试图在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(&#34; middle&#34;)返回12,好像匹配为空。

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

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

matcher.start(&#34; middle&#34;)返回-1,好像没有匹配。

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

我犯了什么错误?

1 个答案:

答案 0 :(得分:2)

它与命名组无关。

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

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

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