正则表达式捕获组未按预期工作
我已经挣扎了两天才能让它发挥作用,但我不能(我对正则表达式很糟糕:S)。
${test}[arg]
从这篇文章中,我需要检索两个不同的东西: test
和arg
。 为此,我创建了这个正则表达式:
(\$\{(\b[a-zA-Z0-9.]+\b)\})(\[(.+)\])?
通过该示例,它可以工作。 但是,如果我尝试这个其他文本: ${test}[arg1] - ${test2}[arg2]
,我只得到一组与2组: test
和arg1] - ${test2}[arg2
,而不是得到2不同的匹配:一个与组test
和arg1
,另一个与组test2
和arg2
。
我希望你能帮助我。
提前致谢。
这是为什么.+
组合可能是邪恶的典型例子。 使用否定字符集代替:
(\$\{(\b[a-zA-Z0-9]+\b)\})(\[([^]]+)\]) ^^^
你可以在这里试试。
比较两个表达式的行为:
-
贪婪地匹配任何东西 。 对于第二场比赛,正则表达式贪婪地匹配任何东西。 它将匹配任何东西,直到它到达字符串的末尾,然后必须回溯直到它找到
]
。 一旦找到]
,它就会停止,因此你最终会以[arg1] - ${test2}[arg2]
作为匹配。 -
匹配除了a之外的任何东西 这里正则表达式匹配任何不是
]
东西,因此每一步都检查下一个是否是]
。 对于第二场比赛,你可以看到,一旦找到]
,它就会停止。