2、元字符详解:点号(.)、反斜杠(\d、\w、\s)、边界匹配符(^、$、\b)

元字符是正则表达式的灵魂。说白了,正则就是靠这些特殊符号来「表达规则」的。今天咱们把最常用、也最容易出错的几组元字符彻底讲透。

我个人习惯把元字符分成三类:通配类(点号)、简写类(反斜杠系列)、定位类(边界匹配)。这三类各司其职,组合起来能解决 80% 的匹配需求。

核心记忆口诀:

  • 点号匹配任意,唯独不换行
  • 反斜杠加字母,代表一类字符
  • 边界匹配符,只管位置不管字

2.1 点号(.) —— 万能通配符

点号匹配除换行符以外的任意单个字符。你想想看,它就像个「万能填空卡」,只要那个位置有字符(哪怕是空格、标点),它都能对上。

// 示例:匹配 "cat"、"cot"、"cut"
/c.t/

// 匹配结果
"cat"  → 匹配
"cot"  → 匹配
"cut"  → 匹配
"ct"   → 不匹配(中间没字符)
"ca t" → 匹配(空格也算字符)

我在项目中遇到过一个问题:用点号匹配用户输入的邮箱前缀,结果换行符导致匹配失败。嗯,这里要注意——点号不匹配换行。如果你非要让它连换行也匹配,可以用 [\s\S] 或者开启 s 修饰符(也叫 DOTALL 模式)。

避坑指南:

我曾经在解析多行日志时,用 .* 想匹配一整段内容,结果只匹配到第一行。后来才意识到点号不匹配换行。解决方案:用 [\s\S]* 代替 .*,或者加 s 标志。

2.2 反斜杠简写类 —— 字符集的快捷方式

反斜杠加字母,是正则里最实用的设计。它把常用字符集浓缩成一个符号,写起来快,读起来也直观。

元字符 含义 等价字符集 匹配示例
\d 数字 [0-9] "5"、"0"、"9"
\w 单词字符 [a-zA-Z0-9_] "a"、"Z"、"3"、"_"
\s 空白字符 [ \t\n\r\f\v] 空格、制表符、换行
\D 非数字 [^0-9] "a"、"#"、空格
\W 非单词字符 [^a-zA-Z0-9_] "@"、"$"、空格
\S 非空白字符 [^ \t\n\r\f\v] "a"、"3"、"@"

\d —— 数字匹配

\d 等价于 [0-9],匹配任意一个阿拉伯数字。我建议你在匹配电话号码、身份证号、金额时优先用 \d,比写 [0-9] 省三个字符,而且语义更清晰。

// 匹配 5 位数字邮编
/\d{5}/

// 匹配手机号前 3 位
/1\d{2}/

\w —— 单词字符

\w 匹配字母、数字和下划线。注意:它不匹配中文,也不匹配连字符 - 或点号 .。很多新手用 \w+ 匹配用户名,结果中文用户名全跪了。

小技巧:

如果你需要匹配「字母、数字、下划线、中文」,可以用 [\w\u4e00-\u9fa5]。我在做用户昵称校验时就是这么干的。

\s —— 空白字符

\s 匹配空格、制表符 \t、换行 \n、回车 \r、换页 \f、垂直制表 \v。说白了,就是所有「看不见但占位置」的字符。

我记得有一次调试爬虫,用 \s+ 替换多余空白,结果把换行也吞了,整个文本变成一大坨。后来改用 [^\S\n]+ 才保留换行。你想想看,\s 虽然方便,但用之前得想清楚你到底要匹配哪些空白。

2.3 边界匹配符 —— 定位的艺术

边界匹配符不匹配字符,只匹配位置。这是正则里最难理解、也最强大的概念之一。

^ —— 起始锚点

^ 匹配字符串的开头位置。在多行模式下,它匹配每一行的开头。

// 匹配以 "http" 开头的字符串
/^http/

// 匹配结果
"http://example.com"  → 匹配
"https://example.com" → 匹配(http 在开头)
"ftp://example.com"   → 不匹配

$ —— 结束锚点

$ 匹配字符串的结尾位置。和多行模式配合时,匹配每一行的结尾。

// 匹配以 ".com" 结尾的字符串
/\.com$/

// 注意:点号需要转义,否则它匹配任意字符

常见错误:

我曾经犯过一个低级错误:用 /^abc$/ 想匹配包含 "abc" 的字符串,结果它只匹配恰好是 "abc" 的字符串。因为 ^ 和 $ 同时使用时,要求字符串从头到尾完全匹配。

\b —— 单词边界

\b 匹配单词字符和非单词字符之间的位置。它不占字符,只占位置。我刚开始学的时候觉得这玩意儿很玄乎,后来用多了才发现它特别实用。

// 匹配独立的 "cat",不匹配 "catalog" 里的 "cat"
/\bcat\b/

// 匹配结果
"cat"       → 匹配
"a cat is"  → 匹配(cat 前后都是边界)
"catalog"   → 不匹配(t 后面是字母,不是边界)
"concat"    → 不匹配

你想想看,如果没有 \b,你想匹配一个完整的单词,就得手动检查前后是不是非单词字符,那代码得多啰嗦。

2.4 知识体系总览

下面这张图把本章的元字符体系串起来了。我建议你保存下来,写正则时当速查表用。

元字符知识体系总览 通配类:点号(.) 简写类:反斜杠系列 定位类:边界匹配符 匹配规则 匹配任意单个字符 不匹配换行符(\n) 开启 s 模式可匹配换行 三个核心简写 \d = [0-9] 数字 \w = [a-zA-Z0-9_] 单词字符 \s = [ \t\n\r\f\v] 空白字符 大写形式 = 反向匹配(如 \D = 非数字) 三个定位符 ^ 字符串/行开头 $ 字符串/行结尾 \b 单词边界位置 \B 非单词边界位置 💡 使用原则 点号通配要谨慎,反斜杠简写最常用 边界匹配定位置,三者组合解万难 实际应用场景 数据校验 · 文本提取 · 日志解析 · 爬虫清洗

2.5 实战组合技巧

光讲理论没意思,咱们直接看几个我实际用过的场景。

场景一:提取 HTML 标签内的文本

// 匹配 <div>...</div> 之间的内容
/<div>(.*?)<\/div>/

// 用 .*? 非贪婪匹配,避免跨标签

场景二:校验强密码

// 至少 8 位,包含大小写字母和数字
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/

// 这里 \d 确保至少一个数字
// 边界符 ^$ 确保从头到尾校验

场景三:提取日志中的 IP 地址

// 匹配 IPv4 地址
/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/

// \b 防止匹配到 "1234.567.890.1234" 里的部分内容

我的个人习惯:

写正则时,我总先问自己三个问题:

  1. 我要匹配的是「字符内容」还是「字符位置」?—— 决定用简写类还是边界类
  2. 这个字符「能不能是任意值」?—— 决定用点号还是具体字符集
  3. 匹配范围「从哪开始到哪结束」?—— 决定要不要加 ^$ 或 \b

这三个问题想清楚,正则基本不会写偏。

好了,元字符这块咱们就聊到这儿。记住:点号是通配、反斜杠是简写、边界是定位。这三板斧练熟了,后面学量词、分组、断言时你会觉得特别轻松。