跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

C#怎么去除字符串空格_C#如何处理空白字符【干货】

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
在高频调用时拖慢性能。 C知道 CSDN推出的一款AI技术问答工具 下载 使用场景:格式化用户输入、预处理 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
或肉眼根本发现不了。

相关文章