Java正则表达式:重复捕获组

Jus*_*ong 24 java regex

项是一个或多个数字或字符串的逗号分隔列表,例如

"12"
"abc"
"12,abc,3"
Run Code Online (Sandbox Code Playgroud)

我正在尝试匹配Java中零个或多个项目的括号列表,例如

""
"(12)"
"(abc,12)"
"(abc,12),(30,asdf)"
"(qqq,pp),(abc,12),(30,asdf,2),"
Run Code Online (Sandbox Code Playgroud)

对于最后一个示例,它应分别返回以下匹配组

qqq,pp
abc,12
30,asdf,2
Run Code Online (Sandbox Code Playgroud)

我想出了以下(不正确)模式

\((.+?)\)(?:,\((.+?)\))*
Run Code Online (Sandbox Code Playgroud)

这与上一个示例仅匹配以下内容

qqq,pp
30,asdf,2
Run Code Online (Sandbox Code Playgroud)

提示?谢谢

aio*_*obe 37

那就对了.您不能在Java正则表达式中拥有"可变"数量的捕获组.您的模式有两组:

\((.+?)\)(?:,\((.+?)\))*
  |___|        |___|
 group 1      group 2
Run Code Online (Sandbox Code Playgroud)

每个组将包含该组的最后一个匹配的内容.即,abc,12将被覆盖30,asdf,2.

相关问题:

解决方案是使用一个表达式(类似的东西\((.+?)\))并用于matcher.find迭代匹配.

  • @David,如果你错过了,他已经给了你一个很好的选择:) (5认同)