正则表达式

简介

换行符和空字符

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] 匹配单个 CRLF(不推荐,易误配) 临时兼容简单场景

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"(制表符)

(二)第二类:空字符串(不占位置的“无字符”)

指“没有任何字符的位置”,正则中无需专门语法匹配,而是通过「边界符」或「可选语法」间接处理。

关键场景:

  1. 匹配空行(行内无任何内容,仅换行):
    • 正则:^$^ 行首,$ 行尾,中间无字符)
    • 若文本是 Windows 格式(CRLF),需兼容换行符:^\r?$(匹配空行 + 可能的 CR
  2. 匹配可选的空值(如某字段可填或为空):
    • 正则:^.*$.* 匹配任意字符(包括空))
    • 或精准匹配空:^$(仅匹配空字符串,不匹配任何字符)

示例:

  • 需求:过滤文本中的空行
    ^\s*$  // \s* 匹配0个或多个空白字符(包括空),匹配空行或仅含空格/制表符的“伪空行”

三、换行符与空字符的核心区别

维度 换行符(\n/\r\n/\R 空字符
本质 行分隔符(控制文本换行) 空白间隔(\s)或无字符(空字符串)
占位置 占1个字符位置(\r\n 占2个) 空白字符占1个位置,空字符串不占位置
正则语法 \n/\r\n/\R 空白:\s/\t/空格;空字符串:^$
关联关系 \s 包含换行符(\n/\r 空字符串与换行符无包含关系
典型用途 匹配/分割文本行 匹配空格/制表符、过滤空行/空值

四、常用实战总结

  1. 跨平台匹配换行:优先用 \R(支持的语言)或 \r?\n(兼容所有语言);
  2. 匹配空格/制表符(不含换行):用 [ \t](避免 \s 包含换行);
  3. 过滤空行:用 ^\s*$(匹配空行或仅含空白的行);
  4. 匹配包括换行的所有字符:开启单行模式 (?s) + .
  5. 匹配空字符串(无任何内容):用 ^$

通过以上规则,可覆盖正则中换行和空字符的绝大多数使用场景,避免因“看不见的字符”导致匹配失败~