【发布时间】:2018-02-23 22:49:22
【问题描述】:
我正在尝试提取字符串中开始和结束标记之间的数据。有多个匹配项,我需要提取所有匹配项(放入数组或列表中无所谓)
我有一个限制,不能在我的设置中使用正则表达式匹配器,因此我正在考虑将string.split() 与正则表达式一起使用。
def str = "USELESS STUFF START:M A:STUFF1 B:MORE2 C:THAT3 END:M START:M A:STUFF4 B:MORE5 C:THAT6 END:M START:M A:STUFF7 B:MORE8 C:THAT9 END:M USELESS STUFF"
此模式与 Regex Matcher 一起使用,并提取开始和结束标记之间的所有匹配项。
def items = str =~ /(?s)(?<=START:M).*?(?=END:M)/
结果:
[ A:STUFF1 B:MORE2 C:THAT3, A:STUFF4 B:MORE5 C:THAT6, A:STUFF7 B:MORE8 C:THAT9 ]
但是,当我尝试在 string.split 上使用相同的模式时
def items = str.split(/(?s)(?<=START:M).*?(?=END:M)/)
它为每个匹配返回结束和开始标记本身,而不是它们之间的内容。
[无用的东西开始:M,结束:M 开始:M,结束:M 开始:M,结束:M 无用的东西]
我错过了什么,为什么拆分模式不返回与 Matcher 模式相同的组?
【问题讨论】:
-
split在每次匹配时剪切字符串,它不会返回匹配项。如果您想要相同的结果,请使用/START:M|END:M/或/.*?START:M|END:M.*?START:M|END:M.*/之类的模式 -
完美,第一个有效,第二个无效,只返回最后一组,跳过前两组。继续回答问题,我会接受。
标签: regex groovy split matcher