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
^^^^^
你的正则表达式过火的原因是 .+
获取了整个字符串然后开始回溯,寻找与 return 的有效匹配。它找到最后一次出现的 _user
,并将整个 John_user function: auditor blablablablabl bla blab New User: Do_user
放入第一个捕获组 - 如果我们将模式限制为仅搜索下划线以外的所有字符(使用 [^_]
).
您可以使用 .+?
获得类似的结果,但取反字符 class 效率更高。但是,如果您的用户名可以包含 _
符号,则您将不得不使用此构造,正则表达式将类似于
\sNew User:\s(.+?_user)\sfunction:\s(auditor|auditor2)\s
我想从字符串中提取几个出现的单词。 我尝试了一些,但结果不是我所期望的。
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
^^^^^
你的正则表达式过火的原因是 .+
获取了整个字符串然后开始回溯,寻找与 return 的有效匹配。它找到最后一次出现的 _user
,并将整个 John_user function: auditor blablablablabl bla blab New User: Do_user
放入第一个捕获组 - 如果我们将模式限制为仅搜索下划线以外的所有字符(使用 [^_]
).
您可以使用 .+?
获得类似的结果,但取反字符 class 效率更高。但是,如果您的用户名可以包含 _
符号,则您将不得不使用此构造,正则表达式将类似于
\sNew User:\s(.+?_user)\sfunction:\s(auditor|auditor2)\s