如何使用"},{"表达式分割字符串?String.split()结果异常求助
解决用"},{"分割字符串时split()结果不符合预期的问题
哦,这个坑我之前踩过!问题出在String.split()的参数本质是正则表达式,而你要用来分割的"},{"里的{和}都是正则中的特殊元字符(用来定义量词范围,比如{1,3}表示匹配1到3次),直接传入的话,正则引擎会把它们当成语法符号解析,而不是普通的字符串,自然得不到正确的分割结果。
下面给你两种解决方案,按需选择:
方案1:用Pattern.quote()包裹分隔符(推荐)
Java提供了Pattern.quote()方法,可以把任意字符串转换成正则字面量,让正则引擎完全把它当成普通文本处理,不用手动转义特殊字符,非常省心。
示例代码:
import java.util.regex.Pattern; public class SplitTest { public static void main(String[] args) { String input = "{\"Id\":\"620e1fe3f6f0b48fd385edebdc5896e4865d0c8a1a49ca24b9f8b08a4a1bc17e\",\"Names\":[\"/delete2alpine\"],\"Image\":\"alpine\",\"Command\":\"/bin/sh\"},{\"Id\":\"dfc8494f4b9cc3a409a01032906431b54a2d88bb06b4fed26ede0eb8a37c41a9\",\"Names\":[\"/deletealpine\"],\"Image\":\"alpine\",\"Command\":\"/bin/sh\"}"; // 使用Pattern.quote()处理分隔符 String[] splitResult = input.split(Pattern.quote("},{")); // 处理首尾的多余符号:第一个元素开头的{,最后一个元素结尾的} splitResult[0] = splitResult[0].substring(1); splitResult[splitResult.length - 1] = splitResult[splitResult.length - 1].substring(0, splitResult[splitResult.length - 1].length() - 1); // 打印结果 for (String part : splitResult) { System.out.println("分割后的JSON对象:"); System.out.println(part); } } }
方案2:手动转义正则特殊字符
如果你不想引入Pattern类,也可以手动把{和}转义成正则中的字面量。在正则里,特殊字符需要用\转义,而Java字符串中\本身需要再转义一次(变成\\),所以最终的分隔符字符串是"\\}\\,\\{"。
示例代码:
public class SplitTest { public static void main(String[] args) { String input = "{\"Id\":\"620e1fe3f6f0b48fd385edebdc5896e4865d0c8a1a49ca24b9f8b08a4a1bc17e\",\"Names\":[\"/delete2alpine\"],\"Image\":\"alpine\",\"Command\":\"/bin/sh\"},{\"Id\":\"dfc8494f4b9cc3a409a01032906431b54a2d88bb06b4fed26ede0eb8a37c41a9\",\"Names\":[\"/deletealpine\"],\"Image\":\"alpine\",\"Command\":\"/bin/sh\"}"; // 手动转义特殊字符 String[] splitResult = input.split("\\}\\,\\{"); // 同样处理首尾符号 splitResult[0] = splitResult[0].substring(1); splitResult[splitResult.length - 1] = splitResult[splitResult.length - 1].substring(0, splitResult[splitResult.length - 1].length() - 1); // 打印结果 for (String part : splitResult) { System.out.println("分割后的JSON对象:"); System.out.println(part); } } }
额外建议:用JSON解析库处理更健壮
其实你这个输入本质是多个JSON对象拼接而成,最规范的做法是把它转换成合法的JSON数组(给首尾加[]),然后用JSON解析库(比如Gson、Jackson)来解析,这样即使后续JSON结构变得复杂(比如嵌套对象),也不会出现分割错误的问题。
示例(用Gson):
import com.google.gson.Gson; import com.google.gson.JsonArray; public class JsonParseTest { public static void main(String[] args) { String input = "{\"Id\":\"620e1fe3f6f0b48fd385edebdc5896e4865d0c8a1a49ca24b9f8b08a4a1bc17e\",\"Names\":[\"/delete2alpine\"],\"Image\":\"alpine\",\"Command\":\"/bin/sh\"},{\"Id\":\"dfc8494f4b9cc3a409a01032906431b54a2d88bb06b4fed26ede0eb8a37c41a9\",\"Names\":[\"/deletealpine\"],\"Image\":\"alpine\",\"Command\":\"/bin/sh\"}"; // 转换成合法的JSON数组字符串 String jsonArrayStr = "[" + input + "]"; // 用Gson解析 Gson gson = new Gson(); JsonArray jsonArray = gson.fromJson(jsonArrayStr, JsonArray.class); // 遍历每个JSON对象 for (int i = 0; i < jsonArray.size(); i++) { System.out.println("解析后的JSON对象:"); System.out.println(jsonArray.get(i).toString()); } } }
内容的提问来源于stack exchange,提问作者Pedro_Galahad
相关产品推荐
相关产品推荐

