JavaScript正则需理解RegExp行为、修饰符作用及方法差异:test()返回布尔值,match()非全局时返回匹配数组,全局时仅返回字符串数组并丢失捕获组和位置信息;exec()最稳定;g/i/m修饰符改变匹配逻辑;动态创建需注意双重转义。
JavaScript 中的正则表达式不是“写出来就能匹配对”,关键在理解 RegExp 对象行为、修饰符作用和字符串方法的差异。
/abc/.test("abc") 返回 true,但 "abc".match(/abc/) 有时返回 null?这是最常踩的坑:不同方法对“没匹配到”的处理方式不同,且 match() 在全局模式下行为突变。
test() 和 exec() 始终返回布尔值或匹配对象(含 index、0 等属性),没匹配就返回 null
match() 在非全局(/g)时返回类似 exec() 的数组;加了 /g 就只返回纯匹配字符串数组,**丢掉所有捕获组和位置信息**exec();想取全部字符串匹配,才用 match(/.../g)
g、i、m 修饰符?修饰符不是可有可无的开关,它们直接改变引擎扫描逻辑和锚点含义。
i:启用大小写不敏感,但注意它对 Unicode 字符(如带重音符号的字母)支持有限,必要时用 u 修饰符配合 \p{L}
g:让 exec() 和 replace() 能连续匹配,但会修改 lastIndex 属性——同一个正则实例多次调用 exec() 时,必须手动重置 l
astIndex = 0,否则可能跳过开头m:只在启用了 ^ 和 $ 时生效,让它们匹配每行起止,而不是整个字符串首尾;没写 ^ 或 $ 时加 m 没效果new RegExp("\\d+") 要写两个反斜杠?因为字符串字面量先解析一次转义,正则引擎再解析一次。你写的 "\\d" 经字符串解析后变成 "\d",才传给 RegExp 构造函数。
/\d+/ 更安全,反斜杠只被正则引擎解析一次new RegExp("(" + keyword + ")", "g") → 如果 keyword 含 \ 或 $,需额外转义new RegExp("\b") 实际传入的是退格符 \x08,不是单词边界 \b;应写成 new RegExp("\\b")
真正难的不是写出一个能跑的正则,而是预判它在不同输入、不同方法、不同修饰符组合下的实际行为。尤其注意 lastIndex 状态残留、g 模式对 match() 返回值结构的破坏,以及字符串构造时的双重转义陷阱。