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 个错误:
- 你的方法返回了一个
String
,虽然它应该返回一个 List
,这就是为什么你得到 List.toString()
表示的大小,而不是 List.size()
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 字符串。
在我下面的代码中,我得到以下结果: 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 个错误:
- 你的方法返回了一个
String
,虽然它应该返回一个List
,这就是为什么你得到List.toString()
表示的大小,而不是List.size()
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 字符串。