C#正则表达式按逗号或空格分割,忽略单双引号内内容的问题
解决C# Regex.Split分割文本时忽略引号内分隔符的问题
需求说明
- 目标:使用C#的
Regex.Split方法按逗号或空格分割文本,但忽略单双引号(含中文引号“”、‘’)内的逗号和空格 - 输入文本:
Hello world “Boston Red Sox”, ‘Pepperoni Pizza’, ‘Cheese Pizza’, beer - 期望输出:
Hello World Boston Red Sox Pepperoni Pizza Cheese Pizza Beer
现有代码问题
当前代码的正则表达式存在多处缺陷:
- 仅适配英文双引号
",未处理输入中的中文引号“”、‘’ - 分割逻辑仅针对逗号,未正确识别空格作为分隔符的场景
- 正则分组逻辑错误,无法拆分引号外的空格(如
Hello world未被拆分为两个独立项) - 输出保留了引号,不符合期望格式
修正后的代码
class Program { static void Main(string[] args) { string censoredfile = System.IO.File.ReadAllText(@"censored.txt"); var outputFile = "output.txt"; // 正则:匹配引号外的逗号/空格位置,同时跳过各类引号包裹的内容 string splitPattern = @"(?<!(“[^”]+|‘[^’]+|""[^""]+""|'[^']+'))(?=[, ])|(?<=[, ])(?!(“[^”]+|‘[^’]+|""[^""]+""|'[^']+'))"; var results = Regex.Split(censoredfile, splitPattern) .Where(item => !string.IsNullOrWhiteSpace(item)) .Select(item => // 去除首尾引号并修剪空白 Regex.Replace(item.Trim(), @"^[“”‘’""']|[“”‘’""']$", "").Trim()) .Select(item => char.ToUpper(item[0]) + item.Substring(1)); // 输出到控制台并写入文件 foreach (var result in results) { Console.WriteLine(result); System.IO.File.AppendAllText(outputFile, result + Environment.NewLine); } } }
关键逻辑说明
- 正则分割规则:通过零宽断言确保仅在引号外的逗号或空格位置分割,同时匹配中文/英文单双引号的包裹内容,避免拆分内部文本
- 结果清洗:
- 过滤分割产生的空字符串和空白项
- 移除每个项首尾的各类引号
- 将每个项首字母大写,匹配期望输出格式
- 文件操作:补充了结果写入输出文件的逻辑,确保持久化保存
内容的提问来源于stack exchange,提问作者ChrisPasa
相关产品推荐
相关产品推荐

