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 知识体系总览
下面这张图把本章的元字符体系串起来了。我建议你保存下来,写正则时当速查表用。
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" 里的部分内容
我的个人习惯:
写正则时,我总先问自己三个问题:
- 我要匹配的是「字符内容」还是「字符位置」?—— 决定用简写类还是边界类
- 这个字符「能不能是任意值」?—— 决定用点号还是具体字符集
- 匹配范围「从哪开始到哪结束」?—— 决定要不要加 ^$ 或 \b
这三个问题想清楚,正则基本不会写偏。
好了,元字符这块咱们就聊到这儿。记住:点号是通配、反斜杠是简写、边界是定位。这三板斧练熟了,后面学量词、分组、断言时你会觉得特别轻松。