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
相关产品推荐
相关产品推荐

