Groovy - 多捕获组

Groovy - multi capturing group

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

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

....

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

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

regex demo

你的正则表达式过火的原因是 .+ 获取了整个字符串然后开始回溯,寻找与 return 的有效匹配。它找到最后一次出现的 _user,并将整个 John_user function: auditor blablablablabl bla blab New User: Do_user 放入第一个捕获组 - 如果我们将模式限制为仅搜索下划线以外的所有字符(使用 [^_]).

您可以使用 .+? 获得类似的结果,但取反字符 class 效率更高。但是,如果您的用户名可以包含 _ 符号,则您将不得不使用此构造,正则表达式将类似于

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

this demo