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

C#正则表达式需求:支持转义引号的字符串按空格分割

C# 按空格分割字符串(保留引号内内容并支持转义引号)

问题描述

需要实现按空格分割字符串,但保留双引号内的完整内容,同时支持用\"作为转义字符,在引号内部包含普通双引号。现有正则无法正确解析带转义引号的场景(比如"Five \"Six\"")。

原代码问题

原正则@"[""].+?[""]|[^ ]+"采用非贪婪匹配引号内内容,但未处理转义逻辑,会把"Five \"Six\""错误截断——它会把转义后的"当成引号块的结束标记。

解决方案

使用支持转义引号的正则表达式,同时在后续处理中还原转义的引号:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

public class StringSplitter
{
    public static List<string> SplitWithQuotes(string input)
    {
        // 匹配规则:要么是带转义支持的双引号块,要么是非空格连续字符
        var regex = new Regex(@"""[^""\\]*(?:\\.[^""\\]*)*""|[^ ]+");
        
        return regex.Matches(input)
            .Cast<Match>()
            .Select(match => 
            {
                var value = match.Value;
                // 去掉首尾的双引号(如果是引号块)
                if (value.StartsWith("\"") && value.EndsWith("\""))
                {
                    value = value.Substring(1, value.Length - 2);
                    // 还原转义的双引号:把 \" 替换成 "
                    value = value.Replace(@"\""", @"""");
                }
                return value;
            })
            .ToList();
    }

    // 测试示例
    public static void Main()
    {
        string input = @"One Two ""Three Four"" ""Five \"Six\"""";
        var result = SplitWithQuotes(input);
        
        foreach (var item in result)
        {
            Console.WriteLine($"- {item}");
        }
    }
}

正则表达式解析

@"""[^""\\]*(?:\\.[^""\\]*)*""|[^ ]+" 各部分含义:

  • """:匹配引号块的起始双引号(C#中需用双引号转义双引号)
  • [^""\\]*:匹配任意非双引号、非转义符的字符
  • (?:\\.[^""\\]*)*:非捕获组,匹配转义序列(\ + 任意字符),后续可跟随更多非转义/非引号字符,支持多次转义
  • """:匹配引号块的结束双引号
  • |[^ ]+:分支匹配,处理不带引号的连续非空格字符

测试结果

输入:

One Two "Three Four" "Five \"Six\""

输出:

  • One
  • Two
  • Three Four
  • Five "Six"

内容的提问来源于stack exchange,提问作者LordCaos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:50:41