正则表达式入门到实战:语法速查与常用模式
正则表达式(Regular Expression, 简称 Regex)是一种强大的文本模式匹配工具。它被广泛应用于表单验证、日志分析、文本搜索替换等场景。本文从基础语法到实战模式,帮你系统掌握正则表达式。
基础元字符
元字符是正则表达式中具有特殊含义的字符:
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符) | a.c 匹配 "abc"、"a1c" |
^ | 匹配字符串开头 | ^Hello 匹配 "Hello World" |
$ | 匹配字符串结尾 | end$ 匹配 "the end" |
\d | 匹配数字 [0-9] | \d{3} 匹配 "123" |
\w | 匹配单词字符 [a-zA-Z0-9_] | \w+ 匹配 "hello_42" |
\s | 匹配空白字符 | \s+ 匹配空格、制表符 |
\b | 匹配单词边界 | \bcat\b 精确匹配 "cat" |
量词
量词控制前面的字符或分组重复的次数:
| 量词 | 含义 | 示例 |
|---|---|---|
* | 0 次或多次 | ab*c 匹配 "ac"、"abc"、"abbc" |
+ | 1 次或多次 | ab+c 匹配 "abc"、"abbc",不匹配 "ac" |
? | 0 次或 1 次 | colou?r 匹配 "color" 和 "colour" |
{n} | 恰好 n 次 | \d{4} 匹配 "2024" |
{n,m} | n 到 m 次 | \d{2,4} 匹配 "12"、"123"、"1234" |
{n,} | 至少 n 次 | \w{3,} 匹配 3 个以上字母 |
💡 贪婪 vs 非贪婪:默认情况下量词是贪婪的(尽可能多匹配)。在量词后加
? 可以切换为非贪婪模式。例如 a+? 会尽可能少地匹配 "a"。
字符类
用方括号 [] 定义一组字符中的任意一个:
[abc] 匹配 a、b 或 c
[a-z] 匹配任意小写字母
[A-Z0-9] 匹配大写字母或数字
[^abc] 匹配除 a、b、c 外的任意字符
[\u4e00-\u9fa5] 匹配中文字符
分组与捕获
圆括号 () 用于分组和捕获匹配内容:
// 捕获分组
/((\d{4})-(\d{2})-(\d{2}))/
输入: "2024-03-15"
$1 = "2024-03-15" (整体)
$2 = "2024" (年)
$3 = "03" (月)
$4 = "15" (日)
// 非捕获分组 (?:...)
/(?:https?|ftp):\/\//
匹配 "http://" 或 "https://" 或 "ftp://" 但不捕获协议部分
// 命名捕获组 (?<name>...)
/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
常用修饰符(Flags)
| 标志 | 含义 |
|---|---|
g | 全局匹配(不只是第一个) |
i | 忽略大小写 |
m | 多行模式(^、$ 匹配每行) |
s | 单行模式(. 也匹配换行符) |
实战:常用正则模式
1. 邮箱地址验证
// 基础版
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
// 测试
"user@example.com" ✅
"test.name@mail.co" ✅
"invalid@" ❌
"@example.com" ❌
2. 中国大陆手机号
// 匹配 11 位手机号(1 开头,第二位 3-9)
/^1[3-9]\d{9}$/
// 测试
"13800138000" ✅
"12345678901" ❌ (12 开头无效)
"1380013800" ❌ (10 位)
3. URL 匹配
// 匹配 HTTP/HTTPS URL
/^https?:\/\/([\w-]+\.)+[\w-]+(\/[\w\-./?%&=]*)?$/
// 测试
"https://example.com" ✅
"http://sub.example.com/path" ✅
"ftp://invalid" ❌
4. 提取 HTML 标签
// 匹配 HTML 标签名
/<(\w+)(\s[^>]*)?>/g
// 输入: "<div class='box'><p>Hello</p></div>"
// 匹配: <div class='box'>, <p>
⚠️ 注意:不建议用正则表达式解析完整的 HTML。HTML 是上下文无关语言,正则无法可靠处理嵌套结构。简单提取场景可以用正则,复杂场景请使用 DOM 解析器。
5. 密码强度验证
// 至少 8 位,包含大小写字母和数字
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{8,}$/
// 使用前瞻断言 (?=...) 同时检查多个条件
// (?=.*[a-z]) 至少一个小写字母
// (?=.*[A-Z]) 至少一个大写字母
// (?=.*\d) 至少一个数字
JavaScript 中使用正则
// 方法一:字面量
const regex = /\d{3}-\d{4}/g;
// 方法二:构造函数(适合动态模式)
const regex2 = new RegExp('\\d{3}-\\d{4}', 'g');
// 常用方法
regex.test('010-1234'); // true
'Tel: 010-1234'.match(regex); // ['010-1234']
'010-1234'.replace(regex, '***'); // '***'
'a1b2'.split(/\d/); // ['a', 'b', '']
🛠️ 在线正则表达式测试工具
打开正则工具 →延伸阅读
- URL 编码解码指南 — URL 中的特殊字符与正则匹配
- JSON 格式化指南 — 用正则预处理 JSON 字符串
- 哈希函数详解 — 用正则验证哈希值格式