Trim只能去除首尾Unicode标准空白字符,不处理全角空格(U+3000);需显式传入字符数组或用正则@"[\s\u3000]+"删除所有空格,高频场景可用Span优化性能。

Trim 只能去掉首尾空白,中间的全角空格根本不管
Trim() 默认只处理 Unicode 标准中的「空白字符」(如 ' '、'\t'、'\r'、'\n'),而全角空格 ' '(U+3000)不在其默认范围内,所以 " hello world ".Trim() 结果仍是 " hello world " —— 首尾看着像空,但没被清掉。
解决办法是显式传入要移除的字符数组:
string s = " hello world ";
s = s.Trim(' ', '\t', '\r', '\n', ' '); // 显式包含全角空格
注意:这个操作只影响首尾,中间的 ' ' 依然保留。
想删所有空格(含中间、全角、半角),用正则最稳
正则表达式 Regex.Replace(s, @"[\s\u3000]+", "") 是通用解法:\s 覆盖常见空白(空格、制表、换行等),\u3000 明确匹配全角空格,+ 确保连续多个也只替一次,避免重复替换开销。
常见误用:
- 写成
@"\s+"→ 漏掉全角空格,' '留着不动 - 写成
@"[ \t\n\r ]+"→ 漏掉'\u00A0'(不换行空格)、'\u2000'~'\u200A'(各种窄空格)等边缘情况 - 不用
+而用*→ 空字符串也会被“替换”,无害但多余
推荐封装成小工具方法:
public static string RemoveAllWhitespace(string s) =>
string.IsNullOrEmpty(s) ? s : Regex.Replace(s, @"[\s\u3000]+", "");
性能敏感时别用正则,改用 Span<char> 手动遍历
如果在高频路径(如日志清洗、大量文本解析)中调用,Regex 的编译和状态机开销明显。此时直接用 Span<char></char> + stackalloc 更快:
public static string RemoveAllWhitespaceFast(string s)
{
if (string.IsNullOrEmpty(s)) return s;
Span<char> buffer = stackalloc char[s.Length];
int written = 0;
foreach (char c in s)
{
if (c != ' ' && c != '\t' && c != '\r' && c != '\n' && c != ' ')
buffer[written++] = c;
}
return new string(buffer.Slice(0, written));
}
关键点:
- 没覆盖所有
\s类字符(比如'\u0085'),但覆盖了 99% 实际场景的空格类型 该方法不处理 Unicode 全范围空白,但胜在确定、无 GC、无正则引擎启动成本
- 若字符串超 1MB,
stackalloc可能栈溢出,此时应回退到new char[s.Length]+ArrayPool
别忘了 Encoding 和 UI 场景下的隐性空格
有些“空格”根本不是空格:比如富文本里的 (HTML 不换行空格)、PDF 提取文本时混入的零宽空格 '\u200B'、或某些字体渲染导致的视觉空隙。这些不会被 Trim 或上述正则捕获。
遇到这类问题,先用调试器看实际字符码点:
foreach (char c in s) Console.WriteLine($"U+{((int)c):X4}");
再决定是否追加进正则或手动判断。例如补上零宽空格:@"[\s\u3000\u200B\u200C\u200D]+\"。
真正难的从来不是“怎么删”,而是“你根本不知道它是什么”。


















