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