我想在字符串中提取几个单词。 我尝试了一些但结果不是我所期望的。
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
....
答案 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