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

标签 java regex

<分区>

我已经苦苦挣扎了两天才让它工作,但我就是做不到(我的正则表达式很糟糕: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)\})(\[([^]]+)\])
                              ^^^

可以试试here .


比较两个表达式的行为:

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

  • Match anything but a ] .这里的正则表达式匹配任何不是 ] 的东西,因此在每一步都检查下一个是否是 ]。对于第二个匹配项,您可以看到它一找到 ] 就停止了。

关于java - 正则表达式捕获组未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52019513/

相关文章:

java - 通过 WiFi 下载数据时,我如何知道我已使用 Wifi 连接

java - 为什么 getDeclaredMethod 不适用于与特定方法相关的参数?

javascript - 使用正则表达式解析查询参数

xml - 正则表达式oracle sql 11g解析XML

html - 如何为更严格的 anchor 标记构建正则表达式

java - 如何使用 Java 8 增强 List 方法中的重复对象?列表中的对象是嵌套的,这就是使这个复杂的原因

java - 是否可以使用 Integer.parseInt(String) 将我们通过 get string extra Intent 获得的字符串值转换为整数

java - 自动填充多维 String[][] 数组

javascript - 使用正则表达式在 javascript 中将每个出现的链接替换为其特定的 href 对象( map 链接 -> a href=link)

python - 正则表达式、多括号和方括号