正则表达式
一、什么是正则表达式?
正则表达式(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)