You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:46:24