如何使用正则表达式按双引号分割包含空值的Java字符串
Java按双引号分割字符串的实现方案
需求说明
需要对给定的Java字符串按双引号进行分割,支持双引号包裹的内容为空的场景。
示例原始字符串定义:
String raw = "\"AKINWALE JOHNSON ROTIMI \" \"100000072 \" \"1985" + "0217 \" \" \" \"0250000066 \"" + "\" 08035558619\" \"22324902758 \" \"NG0250002 \" \"9113985 \"";
原实现问题分析
你使用的分割代码为String[] split = raw.split("\"(\\w\\s+|\\s+)\"");,存在两处核心缺陷:
- 正则仅匹配双引号之间为「单词字符+空格」或「纯空格」的场景,无法匹配内容为纯数字、数字+字母组合的情况,会导致切割失败
- 要求双引号之间至少存在1个字符,无法处理双引号包裹内容为空的场景
推荐实现方案
方案1:正则匹配双引号内容(更稳定)
直接匹配所有双引号包裹的内容,不需要切割,逻辑更直观,完美适配空内容场景:
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SplitDemo { public static void main(String[] args) { String raw = "\"AKINWALE JOHNSON ROTIMI \" \"100000072 \" \"1985" + "0217 \" \" \" \"0250000066 \"" + "\" 08035558619\" \"22324902758 \" \"NG0250002 \" \"9113985 \""; List<String> resultList = new ArrayList<>(); // 正则规则:匹配双引号包裹的所有内容,捕获组1为双引号内部的内容 Pattern pattern = Pattern.compile("\"([^\"]*)\""); Matcher matcher = pattern.matcher(raw); while (matcher.find()) { resultList.add(matcher.group(1)); } // 转成字符串数组(按需使用) String[] result = resultList.toArray(new String[0]); } }
正则"([^\"]*)"说明:匹配开头双引号后,捕获0个或多个非双引号的字符,再匹配闭合双引号,支持空内容、任意非双引号字符的场景。
方案2:split切割后筛选结果(更简单)
如果坚持用split实现,可以先按双引号全切割,再取下标为奇数的元素即可(切割后偶数下标为双引号外的内容,奇数下标为双引号内的内容):
String[] allParts = raw.split("\""); List<String> resultList = new ArrayList<>(); // 从下标1开始,步长为2取元素,就是所有双引号内部的内容 for (int i = 1; i < allParts.length; i += 2) { resultList.add(allParts[i]); } String[] result = resultList.toArray(new String[0]);
这个方案不需要写复杂正则,性能更高,也能完美处理空内容场景。
内容的提问来源于stack exchange,提问作者DaviesTobi alex
相关产品推荐
相关产品推荐

