正则表达式入门到实战:语法速查与常用模式

正则表达式(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', '']

🛠️ 在线正则表达式测试工具

打开正则工具 →

延伸阅读