Regex Groovy正则表达式:字符串分割模式返回的结果与匹配器模式不同

Regex Groovy正则表达式:字符串分割模式返回的结果与匹配器模式不同,regex,groovy,split,matcher,Regex,Groovy,Split,Matcher,我试图提取字符串中开始标记和结束标记之间的数据。有多个匹配项,我需要提取所有匹配项(到数组或列表中并不重要) 我有一个限制,无法在我的设置中使用Regex Matcher,因此作为一种替代方法,我正在考虑将string.split()与Regex一起使用 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:

我试图提取字符串中开始标记和结束标记之间的数据。有多个匹配项,我需要提取所有匹配项(到数组或列表中并不重要)

我有一个限制,无法在我的设置中使用Regex Matcher,因此作为一种替代方法,我正在考虑将
string.split()
与Regex一起使用

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"
此模式与正则表达式匹配器一起工作,并提取起始标记和结束标记之间的所有匹配

def items = str =~ /(?s)(?<=START:M).*?(?=END:M)/
它返回每个匹配的结束标记和开始标记,而不是它们之间的内容

[无用的东西开始:M,结束:M开始:M,结束:M开始:M,结束:M无用的东西]


我遗漏了什么,为什么拆分模式没有返回与Matcher模式相同的组?

此行为与方法名称非常对应:

  • 匹配什么文本
  • 用什么分隔符拆分

Groovy在这种情况下所做的就是在标准JavaAPI上添加一些语法糖分。行
def items=str=~/(?s)(?
split
在每个匹配项上剪切字符串,它不会返回匹配项。如果您想要相同的结果,请使用类似于
/START:M | END:M/
/.*的模式?START:M | END:M.*开始:M | END:M.*/
完美,第一个有效,第二个无效,只返回最后一组并跳过前两组。继续并继续回答这个问题,我会接受的。谢谢,很好,但对于我来说,接受这个答案的关键问题是我应该在Split中使用什么模式来复制Matcher行为。我没有提到的是,在开始和结束分隔符之前有一些“东西”,所以删除它们不是一个好主意,因为我最终会添加它们“东西”到第一组。我会更新我的问题,以表明垃圾,所以我想分割模式将需要适应这一点,我同意作为组的一部分来的东西,只是分开处理-请将其添加到答案中,我会接受它
def items = str.split(/(?s)(?<=START:M).*?(?=END:M)/)
Matcher items = Pattern.compile("(?s)(?<=START:M).*?(?=END:M)").matcher(str);
 A:STUFF1 B:MORE2 C:THAT3 
 A:STUFF4 B:MORE5 C:THAT6 
 A:STUFF7 B:MORE8 C:THAT9
START:M
//  A:STUFF1 B:MORE2 C:THAT3 is cut out since it's a separator
END:M START:M
//  A:STUFF4 B:MORE5 C:THAT6 is a separator
END:M START:M
//  A:STUFF7 B:MORE8 C:THAT9 is a separator
END:M
str.substring(str.indexOf("START:M ") + 8, str.lastIndexOf(" END:M"))
   .split(" END:M START:M ")

// or more groovy
str[str.indexOf("START:M ") + 8 .. str.lastIndexOf(" END:M") - 1]
   .split(" END:M START:M ")