⚡ 30 秒速记
- 核心判断:正则引擎按模式在输入上推进、分支和回溯,表达式结构决定正确性与最坏耗时
- 原理主线:围绕 「第一章 正则表达式字符匹配攻略」、「第二章 正则表达式位置匹配攻略」、「第三章 正则表达式括号的作用」 建立输入、状态变化与输出之间的因果关系
- 文章范围:系统讲解正则表达式的原理、字符匹配、模糊匹配(横向与纵向)、常用语法和实用技巧,帮助读者全面掌握正则表达式的用法与应用场景。
- 边界与代价:贪婪量词、嵌套分支和模糊边界可能导致灾难性回溯,Unicode 与多行模式也会改变语义
- 工程落地:先写输入边界和反例,再组合模式;复杂解析优先使用明确的解析器而非一条巨型正则
正则表达式本质上是在匹配字符或字符之间的位置,通过字符组、量词、分支和断言组合出规则。 字符组解决某一位有哪些可能,量词控制连续出现次数,分支按书写顺序尝试,前面的分支成功后就不会继续匹配后面的分支。量词默认贪婪,在后面加 ? 才会尽量少匹配。工程里我会特别检查边界锚点、分支顺序和回溯风险,并用正常输入与异常输入一起验证。
这篇文章不要按 API 清单来背。先用上面的 Mind Map 建立全局结构,再通过交互 DEMO 观察正常路径和边界路径如何改变状态;阅读正文时重点核对每一步的输入、负责执行的参与者、产生的中间状态以及最终可观察结果。遇到版本敏感结论,要把“历史实现”“当前行为”和“工程兼容策略”分开说明;遇到性能或架构取舍,则用实际指标、失败现象和验证手段支撑判断。
版本校准: 原理文章中的代码代表特定实现与写作时间。应用到当前项目时,应先确认浏览器、框架或工具的主版本,再区分稳定的规范语义、可变化的内部实现和项目自身约束。
正则表达式是匹配模式,要么匹配字符,要么匹配位置。请记住这句话
# 第一章 正则表达式字符匹配攻略
# 1.1 两种模糊匹配
如果正则只有精确匹配是没多大意义的,比如
/hello/,也只能匹配字符串中的"hello"这个子串
var regex = /hello/;
console.log( regex.test("hello") );
// => true
- 正则表达式之所以强大,是因为其能实现模糊匹配
- 而模糊匹配,有两个方向上的“模糊”:横向模糊和纵向模糊
# 1.1.1 横向模糊匹配
- 横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的
- 其实现的方式是使用量词。譬如
{m,n},表示连续出现最少m次,最多n次
比如
/ab{2,5}c/表示匹配这样一个字符串:第一个字符是“a”,接下来是2到5个字符“b”,最后是字符“c”。测试如下
var regex = /ab{2,5}c/g;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log( string.match(regex) );
// => ["abbc", "abbbc", "abbbbc", "abbbbbc"]