正则表达式捕获组未按预期工作

我已经挣扎了两天才能让它发挥作用,但我不能(我对正则表达式很糟糕:S)。

${test}[arg] 

从这篇文章中,我需要检索两个不同的东西: testarg 。 为此,我创建了这个正则表达式:

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

通过该示例,它可以工作。 但是,如果我尝试这个其他文本: ${test}[arg1] - ${test2}[arg2] ,我只得到一组与2组: testarg1] - ${test2}[arg2 ,而不是得到2不同的匹配:一个与组testarg1 ,另一个与组test2arg2

我希望你能帮助我。

提前致谢。

这是为什么.+组合可能是邪恶的典型例子。 使用否定字符集代替:

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

你可以在这里试试。


比较两个表达式的行为:

  • 贪婪地匹配任何东西 。 对于第二场比赛,正则表达式贪婪地匹配任何东西。 它将匹配任何东西,直到它到达字符串的末尾,然后必须回溯直到它找到] 。 一旦找到] ,它就会停止,因此你最终会以[arg1] - ${test2}[arg2]作为匹配。

  • 匹配除了a之外的任何东西 这里正则表达式匹配任何不是]东西,因此每一步都检查下一个是否是] 。 对于第二场比赛,你可以看到,一旦找到] ,它就会停止。