Java正则表达式:拆分双花括号外短横线分隔的字符串
Java正则拆分双花括号外部的短横线
问题分析
你需要拆分字符串中仅位于{{}}外部的短横线,内部的-需保留。之前尝试的正则逻辑错误,导致拆分结果不符合预期。
正确正则表达式及代码
使用以下正则可以精准匹配{{}}外部的-:
import java.util.Arrays; public class SplitTest { public static void main(String[] args) { String regex = "-(?=(?:[^}{]*{{[^}{]*}})*[^}{]*$)"; // 测试示例1 String str1 = "{{abc-def}}-123-benefit-{{ghi}}"; String[] result1 = str1.split(regex); System.out.println(Arrays.toString(result1)); // 测试示例2 String str2 = "abc-{{123-def}}-benefit-{{ghi}}"; String[] result2 = str2.split(regex); System.out.println(Arrays.toString(result2)); } }
输出结果
["{{abc-def}}", "123", "benefit", "{{ghi}}"] ["abc", "{{123-def}}", "benefit", "{{ghi}}"]
正则逻辑解释
-(?=(?:[^}{]*{{[^}{]*}})*[^}{]*$) 各部分作用:
-:匹配目标短横线(?=...):正向预查,确保后续内容满足条件才匹配当前-(?:[^}{]*{{[^}{]*}})*:匹配任意数量的完整{{...}}块([^}{]*匹配非{}的任意字符)[^}{]*$:匹配剩余的非{}字符直到字符串结尾
整体逻辑:确保当前-后面的{{和}}是成对出现的,即该-不在任何{{}}内部。
之前正则的问题
- 第一个正则
-(?!\\{\\{^\\{\\{\\}\\}*\\}\\}):负向预查的表达式逻辑混乱,无法正确识别括号内的区域,导致误拆分了{{}}内部的-。 - 第二个正则
-(?:[^,\"]|\"[^\"]*\")+-":逻辑完全偏离需求,针对的是引号包裹的内容,和{{}}无关。
内容的提问来源于stack exchange,提问作者user9150507
相关产品推荐
相关产品推荐

