如何按空格分割字符串但不拆分单引号内内容?求更简洁实现
有没有更简洁的方式分割单引号内包含空格的字符串?
你遇到的场景确实不能直接用Split方法,因为单引号内的空格需要保留。下面提供两种更简洁的实现方式:
方法一:正则表达式(最简洁)
利用正则可以精准匹配单引号包裹的内容,直接提取所有符合要求的片段:
using System.Text.RegularExpressions; string text = "'test string' 'hello world'"; var splittedText = Regex.Matches(text, @"'[^']+'") .Cast<Match>() .Select(match => match.Value) .ToList();
正则表达式'[^']+'的含义是:匹配以单引号开头,后续跟着任意非单引号字符,直到遇到闭合单引号的片段,完美适配你的需求。执行后得到的结果就是:
'test string' 'hello world'
方法二:简化版状态机循环
如果不想依赖正则,也可以把你原来的循环逻辑简化,减少冗余代码:
string text = "'test string' 'hello world'"; var splittedText = new List<string>(); int start = 0; bool inQuote = false; for (int i = 0; i < text.Length; i++) { if (text[i] == '\'') inQuote = !inQuote; if (!inQuote && text[i] == ' ') { if (i > start) splittedText.Add(text.Substring(start, i - start)); start = i + 1; } } // 处理最后一段 if (start < text.Length) splittedText.Add(text.Substring(start));
这个版本修复了原代码中最后一段截取的潜在问题(比如避免多跳过一个字符),同时逻辑更紧凑。
对原代码的小补充
你的原实现思路是对的,但最后一行的Substring(Position + 1, index - Position)可能会在某些边界场景下出问题(比如字符串末尾没有空格时),上面的简化循环已经修正了这个问题。
内容的提问来源于stack exchange,提问作者AnDrEw
相关产品推荐
相关产品推荐

