你有没有写过这样的代码:一段文字里找出所有邮箱地址?或者从日志文件中筛选出错误行?如果全靠手动比对,那工作量简直噩梦一场。这时候,正则表达式登场了——它是一套专门的字符串匹配规则,能让你用一行代码搞定复杂文本查找。
一、它是个啥?
正则表达式(Regular Expression,简称 regex 或 regexp),不是某种编程语言,而是一套匹配规则。你可以把它想象成一个"搜索模板",告诉计算机:“我要找的是符合这种模式的字符串”。
比如 \d{3}-\d{4} 这个规则,意思是"三个数字 + 短横线 + 四个数字"。它能匹配 010-8888 和 139-5555 这样的格式,但不会匹配 abc-def。
二、为啥要学它?
理由很实在:省时省力、精准高效。
- 表单验证:用户输入邮箱时,自动检查格式对不对
- 数据清洗:从一堆杂乱的文本中提取有用信息
- 代码重构:批量替换某类模式,不用一个字符一个字符改
- 日志分析:快速筛选出包含特定关键字的行
很多新手觉得正则太难,其实日常 80% 的场景只需要掌握十几个符号就够了。
三、怎么用?先看几个核心符号
正则的语法确实有点晦涩,但记住了几个高频符号,就能应付大部分情况:
| 符号 | 含义 | 示例 |
|---|---|---|
\d | 任意数字 | \d+ 表示一个或多个数字 |
. | 任意单个字符(换行除外) | a.c 能匹配 abc, a2c |
* | 前项出现零次或多次 | ab*c → ac, abc, abbbbc |
+ | 前项出现一次或多次 | ab+c → abc, abbbc(至少一个b) |
? | 前项出现零次或一次 | colou?r 同时匹配 color 和 colour |
^ | 行首 | ^Hello 表示以 Hello 开头 |
$ | 行尾 | world$ 表示以 world 结尾 |
\s | 空白符(空格、制表、换行) | \s+ 匹配连续空白 |
[abc] | 括号内任一字符 | [aeiou] 匹配任意元音字母 |
( ) | 分组,可捕获内容 | (\d{3})-(\d{4}) 分成两组 |
再看个实际例子:匹配邮箱的基本规则
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
解释一下:
^行首开始[a-zA-Z0-9._%+-]+:用户名部分,字母数字加点等特殊符号,至少一个@:必须带 @ 符号[a-zA-Z0-9.-]+:域名主体\.:分隔点的字面量(需要转义)[a-zA-Z]{2,}:后缀至少两个字母$行尾结束
当然,完整的邮箱正则要复杂得多,但这个基础版已经能覆盖大多数场景了。
四、在不同地方怎么用?
不同编程语言调用正则的方式略有不同,但底层规则一致。
JavaScript:
const email = 'user@example.com';
const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
pattern.test(email); // true
Python:
import re
email = 'user@example.com'
pattern = r'^[^\s@]+@[^\s@]+\.[^\s@]+$'
bool(re.match(pattern, email)) # True
grep (命令行):
# 查找日志中包含 IP 地址的行
grep -Eo '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' app.log
VS Code / Sublime: 在查找框开启正则模式(.*),可以直接替换文本中的模式。
五、避坑指南
写正则时容易掉几个坑:别贪多求全,先满足当下需求;复杂模式要加注释,否则自己两个月后也看不懂;性能上,避免过度回溯,长文本测试时要留意效率。推荐用 regex101.com 在线调试,它实时展示每一步匹配过程,对新手超级友好。
六、总结一句话
正则表达式不是魔法,而是一套约定俗成的搜索规则。你不需要记住所有符号,掌握常用十来个,再配合在线工具查缺补漏,就能解决八成问题。下回写代码碰到字符串提取,先想想能不能用正则,说不定能少写一半行数。
你平时写正则时,最常在哪些场景用它?有没有遇到特别难搞的模式?欢迎在评论区分享你的实战经验。