
🧠 通俗类比:正则表达式是“文字筛子”
想象你在沙滩上找贝壳(文字中找内容):
- 如果用手捡,效率低,还可能漏掉(人工查找)。
- 如果用一个精细的筛子,只让“贝壳”掉下来,其它沙子就被过滤掉了(正则表达式)!
比喻:
正则术语 | 类比解释 |
---|---|
模式(pattern) | 筛子的“孔洞形状”,决定你要抓什么 |
匹配(match) | 贝壳正好卡在筛子里 |
字符串 | 沙滩(原始文字) |
提取/替换 | 把找到的贝壳收起来 / 换成别的 |
✨ 正则表达式的优点
- 高效准确:可以一行代码找出成千上万行文字中符合规则的部分。
- 灵活强大:能处理邮箱、身份证、日期、手机号等各种“格式”的文本。
- 跨语言支持广泛:JavaScript、Python、Java、C# 都支持,写一次可以多处使用。
- 替代手工写循环判断:本来几十行 if 判断,用一行正则就解决。
🎯 正则表达式的设计思想
正则的核心思想是“用最简短的方式描述一类字符串模式”。不是去写死具体内容,而是用“通配规则”说:
“我想找那些以abc开头、后面是3个数字、以xyz结尾的字符串。”
你不关心具体是哪个“abc123xyz”,你只关心它长什么样(形状)。
📘 正则表达式常见语法汇总(常用 + 通俗解释)
1. 字符匹配
正则 | 含义 | 举例匹配 |
---|---|---|
. |
任意一个字符(除换行) | a.b 匹配 acb , a9b |
\d |
数字(0-9) | \d\d 匹配 12 |
\w |
字母、数字、下划线 | \w\w 匹配 ab , A1 , _x |
\s |
空白符(空格、\t、\n) | a\sb 匹配 a b |
\D , \W , \S |
非数字、非单词、非空白 | 相反含义 |
2. 重复数量
正则 | 含义 | 举例 |
---|---|---|
a* |
0次或多次a | 匹配空串、a、aaaa |
a+ |
1次或多次a | 匹配a、aa |
a? |
0次或1次a | 匹配空、a |
a{3} |
恰好3次a | 匹配aaa |
a{2,4} |
2到4次a | 匹配aa 、aaa 、aaaa |
3. 边界
正则 | 含义 | 举例匹配 |
---|---|---|
^ |
行的开头 | ^abc 匹配以abc开头 |
$ |
行的结尾 | xyz$ 匹配以xyz结尾 |
\b |
单词边界 | \bthe\b 匹配“the”这个完整单词 |
\B |
非单词边界 | \Bthe\B 匹配中间的the,如others |
4. 字符集 & 排除
正则 | 含义 | 举例 |
---|---|---|
[abc] |
匹配 a 或 b 或 c | [aeiou] 匹配元音 |
[^abc] |
除了 a/b/c | 排除特定字符 |
[a-z] |
匹配a到z | [A-Za-z0-9] 匹配字母或数字 |
5. 分组和或
正则 | 含义 | 举例 | ||
---|---|---|---|---|
(abc) |
分组,整体匹配 | 可以用作提取、替换 | ||
`a | b` | 匹配a或b | `(cat | dog)` 匹配cat或dog |
6. 贪婪与懒惰匹配
正则 | 含义 | 举例 |
---|---|---|
.* |
贪婪:尽可能多地匹配 | <.*> 会匹配整个<a>hello</a> |
.*? |
懒惰:尽可能少地匹配 | <.*?> 匹配<a> 、</a> 各自 |
📍 应用实例
- 匹配手机号(11位以1开头的数字):
^1\d{10}$
- 邮箱地址:
^\w+@\w+\.\w+$
- 日期(如 2025-06-12):
\d{4}-\d{2}-\d{2}
- 查找所有HTML标签名:
<([a-zA-Z][a-zA-Z0-9]*)[^>]*>
🛠 小提示
- 可以用网站测试正则表达式,如:regex101.com
- 编程中常搭配
.match()
、.replace()
、.test()
、.search()
等函数使用。
练习
1. 匹配所有由 3个小写字母组成的单词
例子:cat
、dog
、sun
✔
不匹配:Cat
、cats
、a1b
❌
→ 答案:^[a-z]{3}$
2. 匹配一个 整数(正负都可以)
例子:123
、-456
、0
✔
不匹配:12.3
、+34
❌
→ 答案:^-?\d+$
3. 匹配一个 手机号(中国大陆 11 位,以 1 开头)
例子:13812345678
✔
不匹配:23812345678
、1381234567
❌
→ 答案:^1\d{10}$
4. 匹配一个以 a
开头,以 z
结尾的字符串,中间可以是任意字符
例子:abcz
、a123z
、az
✔
→ 答案:^a.*z$
🔧 中级练习(掌握分组、选择、边界)
5. 匹配所有的 合法邮箱地址
例子:hello@domain.com
、user.name_12@mail.cn
✔
→ 答案:^\w+([.-]?\w+)*@\w+([.-]?\w+)*\.\w{2,}$
6. 匹配一个 IPv4 地址
例子:192.168.0.1
✔
→ 答案:(简化版)^(\d{1,3}\.){3}\d{1,3}$
(严格判断需加范围判断,如:
25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d
)
7. 匹配所有以 http://
或 https://
开头的 URL
例子:https://example.com
✔
→ 答案:^https?:\/\/[^\s]+$
8. 匹配 HTML 标签(如 <div>
、<a href="#">
等)
→ 答案:<[^>]+>
🧠 高级挑战(应用分组、非贪婪匹配、断言)
9. 提取所有 HTML 中的标签名(不含尖括号)
例子:从 <div class="test">
提取 div
→ 答案:<\s*([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>
10. 匹配 身份证号码(18位,支持末尾 X)
例子:110105199909098877
、33010220001212X123
✔
→ 答案:^\d{17}[\dXx]$
11. 匹配重复的单词(如 “is is”, “hello hello”)
例子:This is is a test.
中匹配 is is
→ 答案:\b(\w+)\s+\1\b
12. 匹配用双引号括起来的内容(懒惰模式)
例子:"hello"
、"name is Tom"
✔
→ 答案:"(.+?)"
🎁 Bonus:实战迷你项目题
13. 从一段文本中提取出所有金额(如¥100.00, ¥200, $3.5)
示例文本:我花了¥100.00和$3.5买了东西。
→ 预期匹配结果:¥100.00
、$3.5
→ 答案:[¥$¥]\d+(\.\d{1,2})?
14. 验证密码强度(最少8位,必须包含大小写字母和数字)
→ 答案:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d]{8,}$