正则表达式——ChatGpt生成
一锅炖不下

🧠 通俗类比:正则表达式是“文字筛子”

想象你在沙滩上找贝壳(文字中找内容):

  • 如果用手捡,效率低,还可能漏掉(人工查找)。
  • 如果用一个精细的筛子,只让“贝壳”掉下来,其它沙子就被过滤掉了(正则表达式)!

比喻:

正则术语 类比解释
模式(pattern) 筛子的“孔洞形状”,决定你要抓什么
匹配(match) 贝壳正好卡在筛子里
字符串 沙滩(原始文字)
提取/替换 把找到的贝壳收起来 / 换成别的

✨ 正则表达式的优点

  1. 高效准确:可以一行代码找出成千上万行文字中符合规则的部分。
  2. 灵活强大:能处理邮箱、身份证、日期、手机号等各种“格式”的文本。
  3. 跨语言支持广泛:JavaScript、Python、Java、C# 都支持,写一次可以多处使用。
  4. 替代手工写循环判断:本来几十行 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 匹配aaaaaaaaa

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>各自

📍 应用实例

  1. 匹配手机号(11位以1开头的数字):^1\d{10}$
  2. 邮箱地址^\w+@\w+\.\w+$
  3. 日期(如 2025-06-12)\d{4}-\d{2}-\d{2}
  4. 查找所有HTML标签名<([a-zA-Z][a-zA-Z0-9]*)[^>]*>

🛠 小提示

  • 可以用网站测试正则表达式,如:regex101.com
  • 编程中常搭配 .match().replace().test().search() 等函数使用。

练习

1. 匹配所有由 3个小写字母组成的单词

例子:catdogsun
不匹配:Catcatsa1b
→ 答案:^[a-z]{3}$


2. 匹配一个 整数(正负都可以)

例子:123-4560
不匹配:12.3+34
→ 答案:^-?\d+$


3. 匹配一个 手机号(中国大陆 11 位,以 1 开头)

例子:13812345678
不匹配:238123456781381234567
→ 答案:^1\d{10}$


4. 匹配一个以 a 开头,以 z 结尾的字符串,中间可以是任意字符

例子:abcza123zaz
→ 答案:^a.*z$


🔧 中级练习(掌握分组、选择、边界)

5. 匹配所有的 合法邮箱地址

例子:hello@domain.comuser.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)

例子:11010519990909887733010220001212X123
→ 答案:^\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,}$