首先要知道,不同操作系统的换行符确实不一样。这是一个历史遗留问题:
一、各平台换行符差异
| 操作系统 | 换行符 | 转义符 | ASCII 字符 |
|---|---|---|---|
| Windows | 回车+换行 | \r\n | CR + LF |
| Linux / macOS (现代) | 换行 | \n | LF |
| macOS (经典版本 9及以前) | 回车 | \r | CR |
| Unix / Unix-like | 换行 | \n | LF |
二、通用解析方案:
string.Split (new string[] {"\r\n", "\r", "\n"} , StringSplitOptions.None);
"\r\n", "\r", "\n" 顺序很重要,实际执行过程
Split方法是按顺序匹配数组中的分隔符:
首先尝试匹配
"\r\n"→ 找到"\r\n",分割得到 →["字符串A", "字符串B"]✅然后匹配
"\r"→ 但字符串已经被分割,不会再在"A"和"B"内部匹配 ❌。就不会出现类似["Line1\nLine2", "Line3"]的结果。
三、StringSplitOptions枚举: 有两种类型:代表是否移除Empty字符。
① StringSplitOptions.None
默认不做特殊处理,即保留空字符 "",例如A-B-用-分割是 string[3] {A,B,}
② StringSplitOptions.RemoveEmptyEntries
优化掉空字符 "",例如A-B-用-分割是 string[2] {A,B} ,相当于使用 IsNullOrEmpty 优化一遍 string数组。(注意仅仅是 "" 字符,不包括空白字符 " ")
cs
// 处理所有常见的换行符(\n, \r\n, \r)
string[] lines = text.Split(new[] { "\r\n", "\r", "\n" },
StringSplitOptions.None);
// 或者使用 RemoveEmptyEntries 移除空行
string[] lines2 = text.Split(new[] { "\r\n", "\r", "\n" },
StringSplitOptions.RemoveEmptyEntries));