编程入门:正则表达式详解教程

一、什么是正则表达式?

正则表达式(Regular Expression)是一种用于匹配字符串中字符组合的模式。它由普通字符和特殊字符(元字符)组成,形成一种"文本搜索公式"。

核心用途

  • 验证输入格式(如邮箱、手机号、密码强度)
  • 从文本中提取特定信息(如URL、日期、价格)
  • 批量替换文本内容(如日志清洗、数据格式化)
  • 文本分割(如按多种分隔符切分)

形象比喻:正则表达式就像一把"智能筛子",能从海量文本中精准筛选出符合特定规则的内容。


二、基础元字符速查表

元字符 含义 示例
. 匹配任意单个字符(除换行) a.c 匹配 "abc"、"a1c"
* 匹配前一项0次或多次 ab* 匹配 "a"、"ab"、"abb"
+ 匹配前一项1次或多次 ab+ 匹配 "ab"、"abb"(不匹配"a")
? 匹配前一项0次或1次 colou?r 匹配 "color" 或 "colour"
^ 匹配字符串开头 ^Hello 匹配以"Hello"开头的文本
$ 匹配字符串结尾 world$ 匹配以"world"结尾的文本
[] 字符集合,匹配其中任意一个 [aeiou] 匹配任意元音字母
[^] 否定字符集,匹配不在其中的字符 [^0-9] 匹配任意非数字字符
| 或运算符,匹配左右任意一项 cat|dog 匹配 "cat" 或 "dog"
() 分组,可捕获匹配内容 (ab)+ 匹配 "ab"、"abab"

三、常用预定义字符类

简写 等价形式 含义
\d [0-9] 匹配任意数字
\D [^0-9] 匹配任意非数字
\w [a-zA-Z0-9_] 匹配字母、数字或下划线
\W [^\w] 匹配非单词字符
\s [ \t\n\r] 匹配空白字符
\S [^\s] 匹配非空白字符

四、实战示例:常见场景正则

1. 邮箱验证

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

说明:匹配标准邮箱格式,如 user@example.com

2. 手机号验证(中国大陆)

^1[3-9]\d{9}$

说明:匹配11位手机号,以1开头,第二位3-9

3. 提取URL

https?://[^\s]+

说明:匹配http或https开头的网址

4. 匹配日期(YYYY-MM-DD)

\d{4}-\d{2}-\d{2}

说明:匹配2026-02-21格式的日期

5. 密码强度验证(至少8位,含字母和数字)

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$

说明:使用前瞻断言确保同时包含字母和数字


五、各语言中的正则使用

语言 基本用法
JavaScript const re = /\d+/g; re.test(str); str.match(re);
Python import re; re.search(r'\d+', str); re.findall(r'\d+', str)
Java Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher(str);
PHP preg_match('/\d+/', $str, $matches);

六、贪婪与非贪婪匹配

量词默认是贪婪的,会尽可能多地匹配字符。添加?可变为非贪婪

量词 贪婪 非贪婪
匹配多次 * *?
匹配1次以上 + +?
匹配指定次数 {3,5} {3,5}?

示例:文本 <div>hello</div><div>world</div>

  • 贪婪:<div>.*</div> 匹配整个字符串
  • 非贪婪:<div>.*?</div> 分别匹配两个div标签

七、最佳实践与常见误区

✅ 推荐做法

  • 使用原始字符串(Python的r'')避免转义问题
  • 为复杂正则添加注释,或使用自由空格模式
  • 先测试再上线,使用在线工具验证(如regex101.com)
  • 性能敏感场景避免过度复杂的回溯

❌ 常见误区

  • 用正则解析HTML:HTML嵌套结构不适合正则,应用专用解析器
  • 过度复杂的正则:可读性差,难以维护,可拆分为多步处理
  • 忘记转义特殊字符:如.*?等需匹配字面时要转义
  • 忽略大小写敏感:必要时添加i标志(如/pattern/i