Java使用正则split分割TXT类JSON字符串提取书籍属性方案求助
问题根因
你当前使用的"\\{\\}"正则匹配的是连续的{}字符,但你的TXT文本中两个图书对象的分隔符是}{(前一个对象的闭合花括号和后一个对象的起始花括号直接相连),完全匹配不到分隔符,所以分割结果不符合预期。
另外注意你提供的原始字符串存在语法错误:两个对象的描述字段末尾都漏写了单引号闭合标记,实际存储时需要修正,否则后续解析属性值会出错。
解决方案
1. 最优分割正则
推荐使用零宽断言正则 "(?<=})\\s*(?=\\{)",该正则匹配两个对象之间}和{中间的间隙,还兼容两个对象之间存在空格、换行的场景,分割后每个元素直接是带完整花括号的单个图书对象字符串,无需手动补全符号。
2. 修改后完整代码
import java.nio.charset.StandardCharsets; import java.io.*; public static boolean cargarlibros(){ File f = new File(FILENAME); // 指定UTF-8编码避免乱码 try (BufferedReader buffr = new BufferedReader(new FileReader(f, StandardCharsets.UTF_8))) { String registro; while((registro = buffr.readLine()) != null){ // 用优化后的正则分割 String[] datos = registro.split("(?<=})\\s*(?=\\{)"); // 输出分割结果,后续可在此处添加JSON解析逻辑提取属性 for (String libroStr : datos) { System.out.println(libroStr); } } } catch (IOException ex) { ex.printStackTrace(); return false; } return true; }
3. 后续属性解析建议
分割得到单个对象字符串后,不需要自己写正则提取属性,可将字符串中的单引号替换为双引号、转义内容中的特殊字符后,直接用Gson、Jackson等JSON解析库反序列化为Java对象,代码更简洁,出错概率更低。
内容的提问来源于stack exchange,提问作者Jose Alexander Rios 3Palacios
相关产品推荐
相关产品推荐

