为了使它正常工作,我已经努力了两天,但我做不到(对正则表达式:S太糟糕了。)
${test}[arg]
从本文中,我需要检索两种不同的内容:test
和arg
。为此,我创建了此正则表达式:
(\$\{(\b[a-zA-Z0-9.]+\b)\})(\[(.+)\])?
在该示例中,它可以工作。但是,如果我尝试以下其他文本:${test}[arg1] - ${test2}[arg2]
,则仅获得一个包含两个组的比赛:test
和arg1] - ${test2}[arg2
,而不是获得2个不同的匹配:一个具有组{{1}的比赛}和test
,另一个具有组arg1
和test2
。
希望您能帮助我。
谢谢。
答案 0 :(得分:3)
这是.+
组合为何邪恶的经典示例。改用否定的字符集:
(\$\{(\b[a-zA-Z0-9]+\b)\})(\[([^]]+)\])
^^^
您可以here试试。
比较两个表达式的行为:
Match anything greedily。对于第二个匹配,正则表达式会贪婪地匹配任何东西。它会匹配所有内容,直到到达字符串末尾为止,然后必须回溯直到找到]
。一旦找到]
,它就会停止,因此您最终以[arg1] - ${test2}[arg2]
作为匹配项。
Match anything but a ]
。这里的正则表达式匹配的不是]
以外的任何内容,因此在每一步都要检查下一个是否为]
。对于第二场比赛,您可以看到,一旦找到]
,它就会停止。