Groovy如何获取列表唯一值?正则提取文本结果不符合预期怎么解决?
问题排查与修复方案
存在的问题
- 正则捕获组导致返回嵌套列表
Groovy中findAll()方法匹配带捕获组的正则时,返回结构为List<List<String>>,每个匹配结果对应一个子列表,子列表首位是完整匹配内容,后续元素对应各个捕获组的匹配结果,这就是你得到嵌套列表[[ aaa , aaa ], [ bbb , bbb ], [ ccc , ccc ]]的原因。 - 错误的返回值类型转换
你将findAll()返回的集合强制声明为String类型,Groovy会自动把集合转为字符串格式,此时调用size()统计的是转换后字符串的字符长度,而非集合元素个数,因此得到错误的48的结果。 - 匹配结果带多余空格
正则未过滤START、END与目标内容之间的空格,导致匹配结果首尾带有多余空格。
修复后的代码
如果目标内容不包含空格,可以使用简化写法:
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*(?=\sEND)/ return (str =~ matchStr).findAll() }
如果目标内容可能包含空格,可以用下面的写法保留内容空格,仅去除首尾多余空格:
def getTextBetweenTwoStrings(String str) { def matchStr = /(?<=START)([\s\S]*?)(?=END)/ return (str =~ matchStr).findAll().collect { it[1].trim() } }
输出结果
res = [aaa, bbb, ccc] res size = 3
内容的提问来源于stack exchange,提问作者ASE
相关产品推荐
相关产品推荐

