正则表达式
本节目标:用模式匹配文本,选择字面量或构造函数,并理解字符类、分组、量词和标志。
创建正则表达式
正则表达式(regular expression,简称 regex)描述一类文本模式。固定模式常用 /pattern/flags 字面量:
js
const pattern = /^[A-Z]{2}\d{4}$/;
console.log(pattern.test("AB1234")); // true
console.log(pattern.test("ab1234")); // false模式从 ^ 开始、以 $ 结束,因此要求整段文本匹配。i 忽略大小写,g 查找多个匹配,m 改变行首和行尾断言的行为。
字符类与量词
常用字符类:. 匹配除行终止符外的字符,\d 是数字,\w 是 ASCII 字母、数字和下划线,\s 是空白。方括号可定义集合,例如 [A-F];[^0-9] 表示非数字字符。
量词 * 表示零次或多次,+ 表示至少一次,? 表示零次或一次,{2,4} 表示两到四次。默认量词倾向尽可能多地匹配;在量词后加 ? 可改成非贪婪匹配。
分组、替换和捕获
js
const datePattern = /(\d{4})-(\d{2})-(\d{2})/;
const match = "2026-10-16".match(datePattern);
console.log(match?.[1], match?.[2], match?.[3]);
console.log("Ada Lovelace".replace(/(\w+) (\w+)/, "$2, $1"));圆括号捕获匹配文本;(?:...) 创建不捕获分组;命名分组 (?<year>\d{4}) 可用语义名称取值。前瞻和后顾断言只检查相邻上下文,不将上下文纳入匹配结果。
动态模式与安全
正则字面量中的反斜线需要按 JavaScript 字符串规则转义;从变量构造模式时用 new RegExp(source, flags)。不要把未经转义的用户输入直接拼入模式。避免高风险的嵌套回溯模式,以免恶意输入造成长时间计算。
正则适合局部文本模式,不适合完整解析嵌套语言或验证所有真实邮箱地址格式。
小结与练习
- 用
test()判断是否匹配,用match()获取匹配结果,用replace()替换。 - 锚点、字符类、量词和分组构成常用模式。
- 对动态输入做转义,并留意灾难性回溯。
练习:编写一个模式,匹配 AB-1234 形式的编号,并用捕获组分别取出字母与数字。