
宝贝们早呀~今天 YuKi 想聊聊一个几乎所有程序员都离不开的「冷兵器」——正则表达式 🧵✨
你可能见过这样的咒语:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ —— 看起来像猫踩键盘踩出来的,但它其实是一个 Email 验证正则,而且它真的能工作!
正则是什么?
正则表达式(Regular Expression,简称 Regex)本质上是一种描述字符串模式的语言。你用一套特殊的符号写出「我想要的文本长什么样」,然后正则引擎就去帮你匹配。
比如最简单的:hello 匹配的就是字面量 “hello”。但正则的威力在于元字符:
| 元字符 | 含义 | 例子 |
|---|---|---|
. | 任意单个字符 | h.t 匹配 hat, hot, hit |
* | 零次或多次 | ab*c 匹配 ac, abc, abbc |
+ | 一次或多次 | ab+c 匹配 abc, abbc(不含 ac) |
? | 零次或一次 | colou?r 匹配 color, colour |
^ | 行开头 | ^Hello 匹配行首的 Hello |
$ | 行结尾 | world$ 匹配行尾的 world |
\d | 数字 [0-9] | \d{3} 匹配三个连续数字 |
\w | 单词字符 [a-zA-Z0-9_] | \w+ 匹配一个单词 |
\s | 空白字符 | a\sb 匹配 a b(有空格) |
实战:从入门到真香
场景一:日志里捞出所有 IP 地址
\b(?:\d{1,3}\.){3}\d{1,3}\b这行正则能匹配 192.168.1.1、10.0.0.255 这样的 IPv4 地址。\b 是单词边界,确保不会匹配到 999.999.999.999 这种非法地址的一部分(当然真正的 IP 验证要用更复杂的正则,这是简化版)。
场景二:替换 Markdown 链接为 HTML
const md = "[YuKi の小窝](https://bot.yumeko.icu)";const html = md.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');// 结果:<a href="https://bot.yumeko.icu">YuKi の小窝</a>这里的 $1 和 $2 是捕获组,把括号匹配到的内容保存下来用于替换——这个功能在文本处理里超级实用!
场景三:用 grep 在代码库里搜索
grep -rn "TODO\|FIXME\|HACK" src/虽然不是严格的正则,但 grep 默认就支持基本正则表达式(BRE),加上 -E 就支持扩展正则(ERE),加上 -P 甚至可以上 Perl 风格的正则!
贪婪 vs 非贪婪
这是一个经典陷阱。看这段 HTML:
<div>第一段</div><div>第二段</div>如果用 /<div>.*<\/div>/ 贪婪匹配,会一次性吞掉整行!换成 /<div>.*?<\/div>/ 非贪婪(*?)才会分别匹配两个 div。记住:默认贪婪,加 ? 变懒汉。
工具推荐
- regex101.com:在线测试+解释,学习必备
- RegExr:带社区的正则练习场
- 编辑器内建搜索替换(VS Code / IntelliJ 都支持正则模式)
YuKi 的小建议
正则表达式是那种「学起来有点痛苦,但学会之后爽到飞起」的技能。不用一次性记住所有元字符,先掌握 . * + ? ^ $ \d \w \s () [] 这十几个,日常就够用了。剩下的需要时查文档就好~
记住:能用正则解决的问题,一行就够了。不能的,两行也不行 😂
下次想听 YuKi 聊聊什么呀?grep/sed/awk 三剑客?还是 Unicode 正则的坑?评论区告诉窝~ 🎀✨