7JavaScript: The Good Parts

正则表达式

正则表达式

模式匹配捕获组贪婪与非贪婪

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第7章:正则表达式(Regular Expressions)

一、导读

1.1 本章学习目标

第7章讲解 JavaScript 的正则表达式。正则表达式是模式匹配的强大工具。

1.2 为什么第七章如此重要

正则表达式在文本处理、表单验证、数据提取等场景中不可或缺。

1.3 核心问题引导

正则表达式的基本语法是什么?

捕获组如何使用?

贪婪和非贪婪有什么区别?

正则表达式的性能问题是什么?


二、核心概念详解

7.1 基本语法

javascript
// 创建正则表达式
var re1 = /pattern/flags;
var re2 = new RegExp("pattern", "flags");

// 标志
// g: 全局匹配
// i: 忽略大小写
// m: 多行模式

// 字符类
/[abc]/     // 匹配 a, b 或 c
/[^abc]/    // 不匹配 a, b, c
/[a-z]/     // 匹配 a 到 z
/\d/        // 数字 [0-9]
/\w/        // 单词字符 [a-zA-Z0-9_]
/\s/        // 空白字符

// 量词
/a*/        // 0 或多次
/a+/        // 1 或多次
/a?/        // 0 或 1 次
/a{3}/      // 恰好 3 次
/a{2,5}/    // 2 到 5 次

7.2 捕获组

javascript
var re = /(\d{4})-(\d{2})-(\d{2})/;
var match = re.exec("2024-01-15");
match[0];  // "2024-01-15"(完整匹配)
match[1];  // "2024"(第1组)
match[2];  // "01"(第2组)
match[3];  // "15"(第3组)

// 命名捕获组
var re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
var match = re.exec("2024-01-15");
match.groups.year;   // "2024"
match.groups.month;  // "01"

7.3 贪婪与非贪婪

javascript
// 贪婪(默认)
"abcabc".match(/a.*c/);  // ["abcabc"]

// 非贪婪(加 ?)
"abcabc".match(/a.*?c/); // ["abc"]

三、实战案例

7.1 邮箱验证

javascript
function isValidEmail(email) {
    var re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    return re.test(email);
}

isValidEmail("user@example.com");  // true

四、本章小结

正则表达式是强大的模式匹配工具。掌握字符类、量词、捕获组,注意贪婪与非贪婪的区别。


五、思考与练习

正则表达式的基本语法是什么?

捕获组和反向引用如何使用?

贪婪和非贪婪有什么区别?

正则表达式的性能问题是什么?

如何避免正则表达式的灾难性回溯?


7/9正则表达
0%