Skip to content

正则表达式 ​

本节目标:用模式匹配文本,选择字面量或构造函数,并理解字符类、分组、量词和标志。

创建正则表达式 ​

正则表达式(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 形式的编号,并用捕获组分别取出字母与数字。