javascript如何操作正则表达式_如何进行模式匹配【教程】

11次阅读

javaScript正则需协同regexp实例、字符串方法及标志位;字面量与new RegExp()转义规则不同,后者需双反斜杠;test()返回布尔值,exec()返回匹配数组并更新lastIndex,match()有g时丢弃捕获组。

javascript如何操作正则表达式_如何进行模式匹配【教程】

javascript正则表达式不是“用完即弃”的工具,而是要结合 RegExp 实例、字符串方法和标志位协同工作;直接写字面量或用 new RegExp() 会影响转义逻辑和动态性,这点最容易出错。

正则字面量 vs new RegExp():转义规则完全不同

字面量写法如 /d+/g,反斜杠在字符串中不需双写;但用 new RegExp() 构造时,字符串参数里的反斜杠是 js 字符串解析阶段就处理的,所以 d 必须写成 "\d",否则会变成非法转义。

  • ✅ 正确(字面量):const re = /d{3}-d{4}/;
  • ❌ 错误(构造函数):new RegExp("d{3}-d{4}")d 被当普通字符,不匹配数字
  • ✅ 正确(构造函数):new RegExp("\d{3}-\d{4}")new RegExp(/d{3}-d{4}/)

test()exec()match() 的行为差异

这三个是最常用的方法,但返回值和副作用完全不同:前者是布尔判断,中间者带状态(影响 lastIndex),后者依赖全局标志 g 决定是否返回全部匹配。

  • re.test(str):只返回 true/false,不修改 re.lastIndex(除非手动设)
  • re.exec(str):返回匹配数组或 NULL,且每次调用后自动更新 re.lastIndex(仅对带 gy 的正则)
  • str.match(re):无 g 时返回类似 exec 的数组(含 indexinput);有 g 时只返回纯匹配字符串数组,丢弃捕获组信息

全局匹配 + 捕获组:为什么 match() 有时拿不到分组?

加了 g 标志的 match() 会放弃所有捕获组内容,只保留完整匹配项。想拿到每组数据,必须用 exec() 循环,或改用 matchAll()(ES2020+)。

立即学习Java免费学习笔记(深入)”;

  • "a1b2".match(/([a-z])(d)/g)["a1", "b2"](没分组)
  • "a1b2".match(/([a-z])(d)/)["a1", "a", "1", index: 0, input: "a1b2"]
  • Array.from("a1b2".matchAll(/([a-z])(d)/g)) → 返回迭代器,每个元素是完整 exec 结果

真正麻烦的是跨行匹配和 Unicode 字符——. 默认不匹配换行符,w 在非 u 模式下可能漏掉 emoji 或中文;这些细节不会报错,但会让模式在某些输入下静默失效。

text=ZqhQzanResources