我在这里陷入了一种奇怪的境地,试图在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中是否可以使用可选的命名组。
我犯了什么错误?
答案 0 :(得分:2)
它与命名组无关。
原因是.+
贪婪之后的begin
与字符串“middle
”匹配。
您的命名组不匹配任何内容(它明确允许)。
解决方案是制作第一个.+
non-greedy,例如:
begin.+?(?<middle>(middle)?).+end