Groovy中如何分割字符串并保留分隔符至结果数组
在Groovy中分割字符串并保留分隔符
嘿,我懂你的需求——你想要把包含特定标记的字符串分割后,同时把那些标记内容也保留在结果数组里,而不是像原来那样直接丢掉。原来的split写法确实会把匹配到的分隔符排除在外,咱们换个正则思路就能解决这个问题!
问题回顾
你要处理的原字符串:
"Street:§§§§__inboundRow['Adress']['Street']__§§§§ und Postal: §§§§__inboundRow['Adress']['Postal']__§§§§ super"
原来用split(/§§§§__inboundRow.+?__§§§§/)得到的结果是["Street:", " und Postal: ", " super"],但你期望的是把每个标记段也单独作为数组元素,最终得到:
["Street:", "§§§§__inboundRow['Adress']['Street']__§§§§", " und Postal: ", "§§§§__inboundRow['Adress']['Postal']__§§§§", " super"]
解决方案:使用零宽断言修改split正则
Groovy的split支持正则的零宽断言,这种断言能定位分割点但不会消耗匹配的内容,刚好能满足咱们保留分隔符的需求。修改后的代码如下:
def targetStr = "Street:§§§§__inboundRow['Adress']['Street']__§§§§ und Postal: §§§§__inboundRow['Adress']['Postal']__§§§§ super" def resultParts = targetStr.split(/(?<=§§§§__inboundRow.+?__§§§§)|(?=§§§§__inboundRow.+?__§§§§)/)
运行这段代码后,resultParts数组就完全符合你的预期了!
原理解释
这里用到了两种零宽断言的组合:
(?<=...):正向后行断言,意思是“分割点前面必须匹配这个表达式”,但匹配的内容不会被切掉,会作为下一个元素留在数组里。(?=...):正向先行断言,意思是“分割点后面必须匹配这个表达式”,同样匹配的内容不会被消耗,会被单独拆成一个数组元素。- 用
|把两个断言组合起来,就会在每个标记段的前后都设置分割点,这样标记段本身就会被单独提取成数组元素,而前后的普通文本也能完整保留。
另外要提一句,这里用.+?是非贪婪匹配,能确保每次只匹配一个完整的标记段,不会出现一次性匹配多个标记的情况,刚好适配你的字符串结构。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

