Groovy,如何从列表中获取唯一值?

Groovy, how to get unique values from a list?

在我下面的代码中,我得到以下结果: res = [[ aaa , aaa ], [ bbb , bbb ], [ ccc , ccc ]] 分辨率大小 = 48

但我期望的是: res = [aaa, bbb, ccc] 分辨率大小 = 3

有人可以帮助我理解我在这里做错了什么吗?

`

def str = "123  START aaa END  456 START bbb END 789 START ccc END"
def res

res = getTextBetweenTwoStrings(str)

log.info("res = "  + res)
log.info("res size = "  + res.size())

def  getTextBetweenTwoStrings(String str)
{
        def matchStr =  /(?<=START)([\s\S]*?)(?=END)/ 
        String  findmatchStr = (str =~ /$matchStr/).findAll()
}

`

尝试使用 findAll(CharSequence regex):

def matches = str.findAll(/(?<=START)([\s\S]*?)(?=END)/)

assert matches == [" aaa ", " bbb ", " ccc "] // note the spaces are from your regex 

您还可以使用编辑正则表达式来删除捕获组:

assert (str =~ /(?<=START)[\s\S]*?(?=END)/).findAll() == [" aaa ", " bbb ", " ccc "]

有帮助SO answer

您的代码中有 2 个错误:

  1. 你的方法返回了一个 String,虽然它应该返回一个 List,这就是为什么你得到 List.toString() 表示的大小,而不是 List.size()
  2. findAll() 方法 returns 一个复杂的列表列表,包含正则表达式的每个匹配组。

放置代码的正确方式是:

def str = "123  START aaa END  456 START bbb END 789 START ccc END"
def res = getTextBetweenTwoStrings str

assert ['aaa', 'bbb', 'ccc'] == res
assert 3 == res.size()

def  getTextBetweenTwoStrings(String str)
{
   (str =~ /(?<=START)\s*([\s\S]*?)\s*(?=END)/ ).findAll()*.last()
}

还要注意 \s* 组周围的 trim 字符串。