C#的Trim()默认仅移除Unicode空白字符,要去首尾特定字符必须显式传入char[]参数;如"--hello--".Trim()不变,因连字符不在默认范围内;需用Trim('-')或Trim(new char[]{'-','*'})等。

直接说结论:C# 的 Trim() 默认只去空格,要去掉首尾特定字符(比如 '*' 或 '-'),必须传入字符数组参数;不传参或传错类型,结果完全不是你想要的。
为什么 Trim() 看似没效果?
常见错误现象:"--hello--".Trim() 返回 "--hello--",一点没变。这是因为无参 Trim() 只识别 Unicode 空白字符(' '、'\t'、'\n' 等),对连字符、下划线、引号等一概无视。
使用场景:日志清洗、API 响应预处理、用户输入标准化(如去掉包裹的引号或分隔符)。
- 必须显式传入要移除的字符,例如:
"***abc***".Trim('*')→"abc" -
Trim(char)只接受单个字符,不能传字符串;想同时去多种字符,得用Trim(char[]) - 注意大小写敏感:
"AbcA".Trim('a')只去首尾小写'a',不会动大写'A'
TrimStart() 和 TrimEnd() 怎么选?
当只需要单侧清理时,这两个方法比 Trim() 更精准,也避免误删另一端本该保留的字符。
参数差异:和 Trim() 一样,它们也支持 char 和 char[] 重载,但行为仅作用于开头或结尾。
-
"[data]".TrimStart('[').TrimEnd(']')→"data"(安全,但两次分配) - 更高效写法:
"[data]".Trim('[', ']')—— 注意这是Trim(params char[]),不是TrimStart+TrimEnd - 别混用:
"xxabcxx".TrimStart('x').TrimEnd('y')不会报错,但TrimEnd('y')对它无效,容易让人误以为“两端都处理了”
遇到中文符号、全角空格或不可见字符怎么办?
性能 / 兼容性影响:默认 Trim() 对全角空格( ,U+3000)、零宽空格(\u200B)、BOM 头等完全无效,这些在爬虫数据或富文本粘贴中很常见。
实操建议:
- 先确认真实字符:
input.Select(c => (int)c)查看每个字符的 Unicode 编码 - 手动补全常见干扰字符:
input.Trim('\u3000', '\u200B', '\ufeff', ' ', '\t', '\r', '\n') - 如果规则复杂(比如“去掉所有非字母数字的首尾字符”),别硬扛
Trim,改用正则:Regex.Replace(input, @"^[^\w]+|[^\w]+$", "")
真正麻烦的从来不是“怎么调用”,而是你根本不知道字符串里混进了什么字符 —— 尤其是别人给的 JSON 字段、Excel 导出内容、剪贴板粘贴文本。多打一行 Console.WriteLine(string.Join(",", input.Select(c => $"'{c}'({(int)c})"))),省掉半天排查时间。


















