Groovy中如何提取指定子字符串?现有代码是否有更优实现?
在Groovy中提取目标子串的更优实现方式
你当前的代码通过硬编码索引substring(16)提取子串,这种方式的局限性很明显:依赖原字符串的固定长度,一旦前面的"some infor [1:5]"内容发生变化(比如字符增减),提取结果就会出错,健壮性不足。下面提供几种更灵活可靠的实现方式:
方法1:按空白分割取最后一段(最简洁)
如果目标子串是原字符串的最后一段,且与前面内容用空白分隔,直接分割后取数组最后一个元素即可:
def parentString = "some infor [1:5] 10111" def childString = parentString.split()[-1] println childString // 输出:10111
split()默认按任意空白字符分割字符串,[-1]是Groovy中取数组最后一个元素的简洁写法,无需关心前面内容的长度。
方法2:正则匹配(最灵活)
如果目标子串有特定格式(比如本例中的纯数字),用正则匹配可以精准定位:
def parentString = "some infor [1:5] 10111" def matcher = parentString =~ /(\d+)$/ // 匹配字符串末尾的连续数字 if (matcher.find()) { def childString = matcher.group(1) println childString // 输出:10111 }
如果目标子串不一定是数字,只是最后一个空格后的内容,可调整正则为:
def matcher = parentString =~ /\s(\S+)$/ // 匹配最后一个空格后的非空白内容 if (matcher.find()) { println matcher.group(1) }
正则方式能适配更多复杂场景,比如目标子串位置不固定但格式明确的情况。
方法3:通过lastIndexOf动态定位
找到最后一个空格的位置,再截取后续内容,避免硬编码索引:
def parentString = "some infor [1:5] 10111" def lastSpacePos = parentString.lastIndexOf(' ') def childString = parentString.substring(lastSpacePos + 1) println childString // 输出:10111
这种方式动态获取分割点,只要目标子串在最后一个空格之后,无论前面内容长度如何变化都能正确提取。
内容的提问来源于stack exchange,提问作者Liu Xu
相关产品推荐
相关产品推荐

