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

Java 正则表达式捕获组未按预期工作,java,regex,Java,Regex,我花了两天的时间才让它正常工作,但我就是做不到(我对正则表达式很在行) 从本文中,我需要检索两个不同的内容:test和arg。为此,我创建了以下正则表达式: (\$\{(\b[a-zA-Z0-9.]+\b)\})(\[(.+)\])? 在这个例子中,它是有效的。但是,如果我尝试另一个文本:${test}[arg1]-${test2}[arg2],我只得到两个组的一个匹配:test和arg1]-${test2}[arg2,而不是得到两个不同的匹配:一个组是test和arg1,另一个组是test2

我花了两天的时间才让它正常工作,但我就是做不到(我对正则表达式很在行)

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

(\$\{(\b[a-zA-Z0-9.]+\b)\})(\[(.+)\])?
在这个例子中,它是有效的。但是,如果我尝试另一个文本:
${test}[arg1]-${test2}[arg2]
,我只得到两个组的一个匹配:
test
arg1]-${test2}[arg2
,而不是得到两个不同的匹配:一个组是
test
arg1
,另一个组是
test2
arg2

我希望你能帮助我


提前感谢。

这是一个典型的例子,说明了为什么
+
组合可能是邪恶的。请改用否定字符集:

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


比较两个表达式的行为:

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

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

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