正则表达式捕获组无法正常工作

时间:2018-08-25 17:08:37

标签: java regex

为了使它正常工作,我已经努力了两天,但我做不到(对正则表达式:S太糟糕了。)

${test}[arg]

从本文中,我需要检索两种不同的内容:testarg。为此,我创建了此正则表达式:

(\$\{(\b[a-zA-Z0-9.]+\b)\})(\[(.+)\])?

在该示例中,它可以工作。但是,如果我尝试以下其他文本:${test}[arg1] - ${test2}[arg2],则仅获得一个包含两个组的比赛:testarg1] - ${test2}[arg2,而不是获得2个不同的匹配:一个具有组{{1}的比赛}和test,另一个具有组arg1test2

希望您能帮助我。

谢谢。

1 个答案:

答案 0 :(得分:3)

这是.+组合为何邪恶的经典示例。改用否定的字符集:

(\$\{(\b[a-zA-Z0-9]+\b)\})(\[([^]]+)\])
                              ^^^

您可以here试试。


比较两个表达式的行为:

  • Match anything greedily。对于第二个匹配,正则表达式会贪婪地匹配任何东西。它会匹配所有内容,直到到达字符串末尾为止,然后必须回溯直到找到]。一旦找到],它就会停止,因此您最终以[arg1] - ${test2}[arg2]作为匹配项。

  • Match anything but a ]。这里的正则表达式匹配的不是]以外的任何内容,因此在每一步都要检查下一个是否为]。对于第二场比赛,您可以看到,一旦找到],它就会停止。