Java中如何使用多分隔符(空格/引号)拆分字符串
Java字符串按空格(一个或多个)与引号拆分的实现方案
嘿,这个需求其实挺常见的——要拆分字符串,但又得把引号里的内容当成完整一项,不管里面有多少空格对吧?我给你一套靠谱的实现方案,用Java的正则匹配来搞定,比单纯用split()灵活多了。
需求梳理
先明确下咱们要的拆分规则:
- 引号包裹的内容作为一个整体,哪怕里面包含空格,也不拆分
- 引号外的内容,以一个或多个连续空格作为分隔符拆分
- 最终结果里要去掉引号本身,只保留引号内的实际内容
实现思路
直接用String.split()很难处理“引号内空格不拆分”的场景,所以咱们用正则表达式的Matcher来逐个匹配符合要求的元素。核心正则是"([^"]*)"|(\S+),拆解下逻辑:
"([^"]*)":匹配被双引号包裹的内容,捕获组1提取引号内的文本(不含引号)|:逻辑或,匹配两种情况中的任意一种(\S+):匹配一个或多个非空白字符,也就是引号外的单个“单词”(多个空格会被自动跳过,因为非空白字符不包含空格)
完整代码示例
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class QuoteAwareSplitter { public static List<String> splitString(String input) { List<String> splitItems = new ArrayList<>(); // 定义匹配规则的正则 Pattern pattern = Pattern.compile("\"([^\"]*)\"|(\\S+)"); Matcher matcher = pattern.matcher(input); // 遍历所有匹配到的元素 while (matcher.find()) { if (matcher.group(1) != null) { // 如果是引号内的内容,取第一个捕获组 splitItems.add(matcher.group(1)); } else { // 如果是引号外的单词,取第二个捕获组 splitItems.add(matcher.group(2)); } } return splitItems; } public static void main(String[] args) { // 测试用例1:常规场景 String test1 = "user \"John Doe\" age 30 city \"New York\""; List<String> result1 = splitString(test1); System.out.println("测试用例1输出:"); result1.forEach(item -> System.out.println("- " + item)); // 测试用例2:多个连续空格+首尾空格 String test2 = " hello \"this is a long phrase\" foo bar "; List<String> result2 = splitString(test2); System.out.println("\n测试用例2输出:"); result2.forEach(item -> System.out.println("- " + item)); } }
预期输出
运行上面的代码,你会得到如下结果:
测试用例1输出
- user
- John Doe
- age
- 30
- city
- New York
测试用例2输出
- hello
- this is a long phrase
- foo
- bar
补充说明
- 如果你的字符串用单引号而非双引号,只需要把正则里的
"换成'就行,比如'([^']*)'|(\S+) - 这个方案会自动忽略字符串首尾的空格,也会把中间的多个连续空格当成一个分隔符
- 如果遇到未闭合的引号(比如
"unclosed quote),正则会把从引号开始到字符串结尾的内容都当成引号内部分,要是需要处理这种异常场景,可以在代码里加额外的校验逻辑
内容的提问来源于stack exchange,提问作者Pat Keraudren
相关产品推荐
相关产品推荐

