Java中如何基于子串而非正则拆分/分词字符串?
按字面量子串"}},"拆分Java字符串
没问题,咱们来搞定这个按精确子串拆分Java字符串的需求!首先得明确:Java自带的String.split()默认是按正则表达式匹配分隔符的,而你要的是精准匹配}},"这个子串,不能让它被当作正则规则解析。下面给你两种实用的解决方案:
方法1:JDK原生字面量匹配(推荐)
利用Pattern.quote()方法把分隔符转成正则中的字面量,这样split()就会严格匹配整个子串,不会解析正则语法:
public class StringSplitDemo { public static void main(String[] args) { String str = "{A={111={i=[a,b,c],ii=[e,f]}, 222={iii=[a,e]}}, B={333={i= [b,c]}}}"; String separator = "}},"; // 将分隔符转为正则字面量,避免正则解析干扰 String[] splitResult = str.split(Pattern.quote(separator)); // 输出拆分后的内容 for (String part : splitResult) { System.out.println("拆分片段:" + part); } } }
运行后你会得到两个符合预期的片段:
- 第一片段:
{A={111={i=[a,b,c],ii=[e,f]}, 222={iii=[a,e]}} - 第二片段:
B={333={i= [b,c]}}}
方法2:手动遍历拆分(适合理解底层逻辑)
如果你不想依赖正则相关API,也可以手动遍历字符串,精准查找分隔符位置来拆分,完全是字面量匹配:
import java.util.ArrayList; import java.util.List; public class ManualSplitDemo { public static void main(String[] args) { String str = "{A={111={i=[a,b,c],ii=[e,f]}, 222={iii=[a,e]}}, B={333={i= [b,c]}}}"; String separator = "}},"; List<String> splitResult = new ArrayList<>(); int sepLength = separator.length(); int currentPos = 0; while (currentPos <= str.length()) { // 从当前位置开始查找分隔符 int sepIndex = str.indexOf(separator, currentPos); if (sepIndex == -1) { // 找不到分隔符,添加剩余部分 splitResult.add(str.substring(currentPos)); break; } // 添加当前位置到分隔符前的子串 splitResult.add(str.substring(currentPos, sepIndex)); // 移动指针到分隔符结束的位置 currentPos = sepIndex + sepLength; } // 输出结果 for (String part : splitResult) { System.out.println("拆分片段:" + part); } } }
为啥不能直接用split("}},")?
虽然在这个特定字符串里直接用split("}},")可能得到正确结果,但这是巧合!如果你的分隔符包含正则特殊字符(比如.、*、+等),直接传入会被当作正则规则解析,导致匹配错误。比如分隔符是.,时,split(".,")会匹配任意字符+逗号,而不是字面量的.,。所以用字面量匹配的方式更通用、更安全。
内容的提问来源于stack exchange,提问作者user3322178
相关产品推荐
相关产品推荐

