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)\})(\[([^]]+)\])
^^^