groovy:一次性过滤和提取子字符串



我有下面的一段代码,其中我通过regex过滤列表,然后映射(collect(从每个项目中提取子字符串。

问题是,我能一次搞定吗?(无需迭代两次…(

//mystring is actually an output produced from: "git -C /my/git/repo --list --remote"
def mystring = """
origin/branch_a
origin/branch_b
origin/branch_mykeyword_w12
origin/branch_mykeyword_w14
origin/branch_mykeyword_w16
"""
FIND_BRANCH_PATTERN = ~/.*(mykeyword.+)/
branches = mystring.split("n").findAll{      //<----- Iteration #1
// grab all matching branches
it ==~ FIND_BRANCH_PATTERN
}.collect {                                 //<----- Iteration #2
// get the interesting part of the string
matcher = it =~ FIND_BRANCH_PATTERN
return matcher[0][1]
} 
return branches.reverse()[0..3]
// return:
// ["branch_mykeyword_w12", "branch_mykeyword_w14", "branch_mykeyword_w16"]
//
// (braches filtered by regex + substring extracted)

考虑使用inject方法:

def FIND_BRANCH_PATTERN = ~/.*(mykeyword.+)/
def branches = mystring.split("n").inject([], { acc, branch ->
def matcher = (branch =~ FIND_BRANCH_PATTERN)
if (matcher.matches()) {
acc << matcher[0][1]
}
acc
})
assert 3 == branches.size()

其中CCD_ 2是累积结果列表。

最新更新