Regex Groovy-多捕获组

Regex Groovy-多捕获组,regex,groovy,string-matching,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)\sf

我想从一个字符串中提取几个单词,只要它们存在。 我尝试了一些东西,但结果不是我所期望的

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

....

您需要将
+
替换为
[^\uu]

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

正则表达式溢出的原因是
+
获取整个字符串,然后开始回溯,寻找要返回的有效匹配项。它找到最后一个出现的
\u user
,并将整个
John\u user函数:auditor blablab blab blab New user:Do\u user
放入第一个捕获组-如果我们将模式限制为只搜索所有字符,而不搜索下划线(使用
[^\u]
),就可以避免这种情况

您可以使用
+?
获得类似的结果,但使用否定字符类更有效。但是,如果您的用户名可以包含
\uuu
符号,则必须使用此结构,正则表达式如下所示

\sNew User:\s(.+?_user)\sfunction:\s(auditor|auditor2)\s

请参见

仅供参考:您可能还希望向
\s
子模式添加量词,以便可以匹配0个或多个空格(
\s*
)或1个或多个(
\s+
)。谢谢。假设我有一个用户名包含
如何管理它?然后,正如我在回答末尾所写的,将
[^\u]
替换为
+?
。它的效率较低,但应适用于包含
\ucode>符号的用户名。我更新了答案以包含此要求。