You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:07:29