Groovy中如何分割含%的字符串且不拆分引号内的逗号?
如何在Groovy中正确分割包含引号内逗号的字符串?
你的问题核心是要分割字符串中不在双引号内的逗号,普通的split(",")会把所有逗号都拆分,包括"%Hello,Ram%"里的逗号,这显然不符合需求。我们可以用正则表达式来精准匹配那些不在双引号中的逗号,以此作为分割依据。
解决方案:使用正则表达式匹配非引号内的逗号
Groovy支持基于正则表达式的字符串分割,我们可以利用正向预查断言,确保要分割的逗号不在一对未闭合的双引号内。具体思路是:匹配逗号时,检查当前位置之后的内容中双引号的数量为偶数(说明当前逗号不在引号包裹的范围内)。
下面是完整的实现代码:
def input = 'HAVING first_name like "%Hello,Ram%" AND last_name like "%XYZ%",order by id asc,name desc' // 用正则分割不在双引号内的逗号 def parts = input.split(/(?=(?:[^"]*"[^"]*")*[^"]*$)/) def test1 = parts[0].trim() def test2 = parts[1].trim() println "test1 = $test1" println "test2 = $test2"
代码细节说明
- 正则表达式
(?=(?:[^"]*"[^"]*")*[^"]*$)是正向预查逻辑:它会验证当前位置之后的文本中,双引号是成对出现的,从而确保当前匹配的逗号不在引号内部。 - 调用
trim()是为了去除分割后字符串前后可能存在的空格,让结果更整洁。
运行结果
执行这段代码后,会得到你期望的输出:
test1 = HAVING first_name like "%Hello,Ram%" AND last_name like "%XYZ%"
test2 = order by id asc,name desc
另外提一句,你之前的代码里有个小疏漏:a.split(",")执行后没有赋值给变量,而且println a打印的还是原字符串,所以看不到分割结果,上面的代码已经修正了这个问题。
内容的提问来源于stack exchange,提问作者Sirshak Regmi
相关产品推荐
相关产品推荐

