正则表达式
简介
换行符和空字符
1、换行符和空字符
在正则表达式中,换行符和空字符是两类常用的“非打印控制字符”,用于匹配文本中的换行、空白间隔或特殊空值场景。下面结合定义、语法、使用场景和示例,帮你彻底理清两者的区别和用法:
一、正则中的「换行符」
换行符是用于分隔文本行的控制字符,不同操作系统的换行格式不同(但正则提供了统一的匹配语法)。
1. 核心定义
匹配文本中“行与行之间的分隔符号”,常见的实际换行格式:
\n:Unix/Linux/Mac(现代)系统的换行符(LF,Line Feed);\r\n:Windows 系统的换行符(CRLF,Carriage Return + Line Feed);\r:早期 Mac 系统的换行符(CR)。
2. 正则匹配语法(跨平台通用)
| 语法 | 含义 | 适用场景 |
|---|---|---|
\n |
匹配单个 LF(Unix 风格换行) |
明确知道目标文本是 Unix 格式 |
\r |
匹配单个 CR(早期 Mac 格式) |
极少用,仅兼容旧文本 |
\r?\n |
匹配 CRLF(Windows)或 LF(Unix) |
跨平台通用(推荐,覆盖 99% 场景) |
\R |
匹配任意换行序列(\n/\r\n/\r) |
.NET、Java、Python(3.7+)等支持 |
[\r\n] |
匹配单个 CR 或 LF(不推荐,易误配) |
临时兼容简单场景 |
3. 关键注意事项
- 正则默认不匹配“跨行”:比如
.(匹配任意字符)默认不包含换行符,若需匹配包括换行在内的所有字符,需开启「单行模式」(.匹配换行):- 语法:在正则末尾加
(?s)(内联模式),或通过代码设置RegexOptions.Singleline(如 C#、Java)。
- 语法:在正则末尾加
- 示例:匹配跨两行的文本
(?s)hello.*world // 能匹配 "hello\nworld" 或 "hello\r\nworld"
4. 实际用法示例
- 需求1:匹配 Windows 格式的换行(
CRLF)第一行\r\n第二行 // 精准匹配 "第一行\r\n第二行" - 需求2:跨平台匹配换行,提取每行内容
^.+\R? // ^ 匹配行首,.+ 匹配行内容,\R? 匹配换行(最后一行可能无换行)
二、正则中的「空字符」
空字符是一类“不可见、表示空白或空值”的字符,核心分为两类:空白字符(空格、制表符等)和空字符串(无字符)。
(一)第一类:空白字符(占位置的不可见字符)
指文本中用于分隔元素的空白间隔(如空格、制表符、换行符等),正则提供了专门的语法匹配。
| 语法 | 含义 | 等价于 | 适用场景 |
|---|---|---|---|
\s |
匹配任意空白字符(空格、制表符、换行等) | [ \t\n\r\f\v] |
匹配所有空白间隔(最常用) |
\S |
匹配非空白字符(与 \s 相反) |
[^ \t\n\r\f\v] |
排除空白,提取有效内容 |
(空格) |
匹配单个普通空格 | - | 精准匹配空格(如分隔单词的空格) |
\t |
匹配制表符(Tab 键产生的字符) |
- | 匹配代码缩进、表格分隔的制表符 |
\f |
匹配换页符(Form Feed) | - | 极少用,仅兼容打印机相关文本 |
\v |
匹配垂直制表符(Vertical Tab) | - | 几乎不用 |
注意:\s 包含换行符!
\s的本质是“所有空白类字符”,其中包含\n(换行)、\r(回车),因此:- 若只想匹配“非换行的空白”(如空格、制表符),需手动排除换行:
[ \t]或\s-[^\r\n]。 - 示例:匹配单词间的空格/制表符(不包含换行)
\w+[ \t]+\w+ // 匹配 "hello world"(空格)或 "hello\tworld"(制表符)
- 若只想匹配“非换行的空白”(如空格、制表符),需手动排除换行:
(二)第二类:空字符串(不占位置的“无字符”)
指“没有任何字符的位置”,正则中无需专门语法匹配,而是通过「边界符」或「可选语法」间接处理。
关键场景:
- 匹配空行(行内无任何内容,仅换行):
- 正则:
^$(^行首,$行尾,中间无字符) - 若文本是 Windows 格式(
CRLF),需兼容换行符:^\r?$(匹配空行 + 可能的CR)
- 正则:
- 匹配可选的空值(如某字段可填或为空):
- 正则:
^.*$(.*匹配任意字符(包括空)) - 或精准匹配空:
^$(仅匹配空字符串,不匹配任何字符)
- 正则:
示例:
- 需求:过滤文本中的空行
^\s*$ // \s* 匹配0个或多个空白字符(包括空),匹配空行或仅含空格/制表符的“伪空行”
三、换行符与空字符的核心区别
| 维度 | 换行符(\n/\r\n/\R) |
空字符 |
|---|---|---|
| 本质 | 行分隔符(控制文本换行) | 空白间隔(\s)或无字符(空字符串) |
| 占位置 | 占1个字符位置(\r\n 占2个) |
空白字符占1个位置,空字符串不占位置 |
| 正则语法 | \n/\r\n/\R |
空白:\s/\t/空格;空字符串:^$ |
| 关联关系 | \s 包含换行符(\n/\r) |
空字符串与换行符无包含关系 |
| 典型用途 | 匹配/分割文本行 | 匹配空格/制表符、过滤空行/空值 |
四、常用实战总结
- 跨平台匹配换行:优先用
\R(支持的语言)或\r?\n(兼容所有语言); - 匹配空格/制表符(不含换行):用
[ \t](避免\s包含换行); - 过滤空行:用
^\s*$(匹配空行或仅含空白的行); - 匹配包括换行的所有字符:开启单行模式
(?s)+.; - 匹配空字符串(无任何内容):用
^$。
通过以上规则,可覆盖正则中换行和空字符的绝大多数使用场景,避免因“看不见的字符”导致匹配失败~