正则表达式在javascript中如何运用【教程】

JavaScript正则难点在于RegExp创建方式、标志位行为及方法返回值结构:/pattern/g与new RegExp('pattern','g')因转义差异导致行为不一致;g标志影响exec()的lastIndex;match()无匹配时返回null而非空数组;需捕获组+全局时用exec()循环或matchAll();replace()中$符号仅在正则参数下生效。

JavaScript 中的正则表达式不是“学完就能用”,而是“用错一次就卡半天”——关键在 RegExp 实例的创建方式、标志位行为、以及方法返回值结构这三点。

为什么 /pattern/gnew RegExp('pattern', 'g') 行为有时不一致?

主要差异在转义和动态构建场景:/\d+/g 里反斜杠直接生效;而 new RegExp('\\d+', 'g') 中字符串需双写反斜杠,否则 '\d+' 会被 JS 解析成字面量 d+(因为 \d 不是合法转义,被静默忽略)。

  • 动态拼接时必须用 new RegExp,但记得对特殊字符手动转义(比如用户输入的 $.[ 等)
  • /.../ 字面量无法插入变量,想插就得走 new RegExp(`...${var}...`, 'g')
  • 全局标志 g 影响 exec() 的 lastIndex,多次调用会“记住位置”,重用前要手动重置 regex.lastIndex = 0

String.prototype.match() 返回 null 还是数组?

没匹配到永远返回 null,不是空数组。带 g 标志时只返回匹配内容数组(无捕获组信息);不带 g 时返回含 indexinput 和捕获组的数组(即使没分组,第 0 项也是完整匹配)。

  • 别直接对 match() 结果调用 .l

    ength
    [0],先判 null
  • 需要捕获组又想全局匹配?改用 regexp.exec(str) 循环,它每次返回单次匹配详情
  • ES2025+ 可用 matchAll(),返回迭代器,天然支持捕获组 + 全局,但注意旧环境不兼容

替换字符串时,$1$& 这些符号怎么用才不出错?

它们只在 String.prototype.replace() 的 replacement 参数中生效,且仅当第一个参数是正则(不是字符串)时解析。常见误用:把 str.replace(/a/, '$1') 当成捕获,其实没括号,$1 就是字面量 $1

  • $& 是整个匹配,$1 是第一个捕获组,$` 是匹配前内容,$' 是匹配后内容
  • 函数作为 replacement 时,参数顺序固定:(match, p1, p2, ..., offset, string),比 $ 符号更可控
  • 如果 replacement 来自用户输入,务必避免直接拼接 $ 符号,优先用函数形式

真正难的不是写对一个正则,而是搞清它在哪个方法里跑、标志位是否开启、返回值结构怎么解构——尤其是 lastIndexnull 判定,漏掉这两点,90% 的“正则失效”问题就解决了。