Groovy - 多捕获组

时间:2015-11-04 08:32:34

标签: regex groovy string-matching

我想在字符串中提取几个单词。 我尝试了一些但结果不是我所期望的。

def myString = 'blablabla bla bla blabla New User: John_user function: auditor blablablablabl bla blab New User: Do_user function: auditor2 blablabl blablb...'
def m = myString =~ /\sNew User:\s(.+_user)\sfunction:\s(auditor|auditor2)\s/

我希望有类似的东西:

println m[0][1] //John_user
println m[0][2] //auditor

println m[1][1] //Do_user
println m[1][2] //auditor2

....

1 个答案:

答案 0 :(得分:1)

您需要将.+替换为[^_]

\sNew User:\s([^_]+_user)\sfunction:\s(auditor|auditor2)\s
              ^^^^^

请参阅regex demo

你的正则表达式失败的原因是.+抓取整个字符串然后开始回溯,寻找有效的匹配返回。它找到_user的最后一次出现,并将整个John_user function: auditor blablablablabl bla blab New User: Do_user放入第一个捕获组 - 如果我们将模式限制为仅搜索所有字符而只搜索下划线({{1} }})。

您可以使用[^_]获得类似的结果,但是否定的字符类更有效。但是,如果您的用户名可以包含.+?个符号,则必须使用此构造,并且正则表达式将如下所示

_

请参阅this demo