Trim()仅去除字符串首尾Unicode空白字符,不处理中间空格;需删所有空格用Replace(" ", ""),清理全部Unicode空白则用Regex.Replace(s, @"\s+", ""),但Trim性能更高。

Trim() 只去掉首尾空格,不是全量清理
很多人以为 Trim() 能把字符串里所有空格都干掉,结果发现中间的空格纹丝不动。它只处理开头和结尾的 Unicode 空白字符(比如 ' '、'\t'、'\r'、'\n'),中间的完全不管。
常见错误现象:" hello world ".Trim() → "hello world",中间三个空格还在。
- 如果真要删所有空格,用
Replace(" ", "")最直接(但只针对 ASCII 空格) - 要清理所有 Unicode 空白字符(包括 、 、\u2000等),得用正则:
Regex.Replace(s, @"\s+", "") -
Trim()性能比正则快得多,别在循环里无脑换正则
TrimStart() 和 TrimEnd() 的实际使用场景
当你要保留一端空白、只清理另一端时才用它们。比如日志行末带换行符但开头要对齐,或解析 CSV 时某字段允许前导空格但不能有尾随空格。
参数差异:TrimStart() 和 TrimEnd() 都支持传入字符数组,比如 TrimStart(new char[] { ' ', '\t', '\u00A0' }),能精准控制剔除哪些字符,比默认行为更可控。
- 默认不传参时,它们和
Trim()一样基于 Unicode 类别White_Space - 传入空数组会抛
ArgumentNullException,不是静默忽略 - 如果只清空格不想要其他空白(如制表符),必须显式传
new char[] { ' ' },不能依赖默认
Regex.Replace(@"\s+", " ") 常被误用为“去重空格”
这个写法本意是把连续空白缩成一个空格,但容易踩两个坑:一是 \s 匹配太多(比如换行符、零宽空格),二是没设 RegexOptions.Compiled 在高频调用时拖慢性能。
使用场景:格式化用户输入、预处理 HTML 文本、生成日志摘要。
- 如果只要处理普通空格和制表符,用
Regex.Replace(s, @"[ \t]+", " ")更安全 - 若字符串极长(>10KB)且调用频繁,建议把
Regex实例缓存为static readonly - 注意
\s在 .NET 中默认匹配\u0085(NEL)、\u2028(LS)、\u2029(PS)——这些在某些 API 响应里真实存在,但肉眼不可见
StringSplitOptions.RemoveEmptyEntries 处理 Split 后的空项
Split() 默认会把连续分隔符之间的“空字符串”也当有效项返回,导致数组里一堆 ""。这时候不加 StringSplitOptions.RemoveEmptyEntries,后续遍历就容易触发 NullReferenceException 或逻辑错乱。
常见错误现象:"a,,b,c".Split(',') 返回长度为 4 的数组,含两个空字符串;加了选项后才是 ["a","b","c"]。
-
RemoveEmptyEntries不影响分隔符本身是否被保留(那是StringSplitOptions.None或IncludeEmptyEntries控制的) - 如果分隔符是字符串(如
"||"),选项同样生效,但要注意StringSplitOptions枚举值必须显式传入,不能省略 - 在 .NET 6+ 中,
Split(' ', StringSplitOptions.RemoveEmptyEntries)比先Split()再Where(x => !string.IsNullOrEmpty(x))快 3–5 倍
事情说清了就结束。真正麻烦的是那些看不见的 Unicode 空白字符,调试时打日志得用 string.Select(c => (int)c) 看码点,光靠 .Length 或肉眼根本发现不了。











