正则表达式入门:10 个最常用的元字符和实战例子
正则表达式(Regular Expression)是处理文本的瑞士军刀,但那一串符号劝退了不少人。其实 80% 的日常需求,只用到 10 个元字符。本文用最多的例子把这 10 个讲透。
一、正则到底是什么
正则表达式是一种用符号描述文本模式的语言。比如「3 位数字 - 4 位数字」的电话格式,用正则写就是 \d{3}-\d{4}。它做的事就两件:匹配(判断文本是否符合模式)和提取/替换(把符合模式的部分找出来)。
二、10 个最常用元字符
1. . 任意单个字符
匹配除换行符外的任意一个字符。a.c 能匹配 abc、a1c、a c。
2. \d 数字
等价于 [0-9]。\d\d\d 匹配任意三位数字,如 138。
3. \w 单词字符
字母、数字、下划线,等价于 [A-Za-z0-9_]。匹配用户名、变量名常用。
4. \s 空白字符
空格、制表符 Tab、换行符。处理有多余空白的文本时用。
5. [...] 字符集
匹配方括号里的任意一个字符。[aeiou] 匹配任意元音字母;[0-9] 匹配数字;[^0-9](取反)匹配非数字。
6. * 零次或多次
前一个字符出现 0 次或多次。ab*c 匹配 ac、abc、abbc。
7. + 一次或多次
前一个字符至少出现 1 次。\d+ 匹配一个或多个数字,如 123。
8. ? 零次或一次
前一个字符可有可无。colou?r 同时匹配 color 和 colour。
9. {n,m} 指定次数
\d{3} 恰好 3 位数字;\d{3,4} 3~4 位;\d{3,} 至少 3 位。手机号 1\d{10} 就是「1 开头共 11 位」。
10. ^ 和 $ 首尾锚点
^ 匹配字符串开头,$ 匹配结尾。^\d{4}$ 要求整串恰好是 4 位数字(不多不少)。
三、三个实战例子
例 1:校验手机号
^1[3-9]\d{9}$
解读:^1 以 1 开头,[3-9] 第二位是 3~9,\d{9} 再接 9 位数字,$ 结尾。整串 11 位。
例 2:提取邮箱
[\w.-]+@[\w-]+\.[\w.]+
解读:@ 前是字母数字点横线,@ 后是域名,\. 是字面意义的点(点号是元字符要转义)。
例 3:匹配日期 YYYY-MM-DD
^\d{4}-\d{2}-\d{2}$
解读:4 位年、横线、2 位月、横线、2 位日。注意横线 - 在字符集外不用转义。
四、新手最常踩的坑
- 点号没转义:想匹配网址里的
.却写成.(任意字符),结果匹配了不该匹配的。网址、IP、文件名里的点要写\.。 - 贪婪匹配:
<.+>匹配<a><b>时会一口吞下整段(从第一个<到最后一个>)。要非贪婪就加问号:<.+?>。 - 忘记锚点:校验用
\d{4}而不加^$,那么abc1234xyz也能匹配——它只要求包含 4 位数字。校验一定要加^...$。
五、在线测试工具
写完正则不确定对不对?用本站正则测试工具,粘贴正则和测试文本,实时高亮匹配结果,边调边看,比盲写高效得多。
常见问题
正则表达式难学吗?
入门不难——掌握本文 10 个元字符就能应付大多数场景。难的是复杂正则的可读性,建议复杂逻辑拆成多步,别追求一条正则包打天下。
不同语言的正则一样吗?
核心语法(本文讲的这些)在 Python、Java、JavaScript、PHP 里基本一致,差异在高级特性(如后向引用、命名分组)和部分函数名。
* 和 + 有什么区别?
* 允许出现 0 次(可有可无),+ 至少出现 1 次。ab*c 能匹配 ac,ab+c 不能。
