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()时,必须手动重置lastIndex = 0,否则可能跳过开头 -
m:只在启用了^和$时生效,让它们匹配每行起止,而不是整个字符串首尾;没写^或$时加m没效果
为什么 new RegExp("\\d+") 要写两个反斜杠?
因为字符串字面量先解析一次转义,正则引擎再解析一次。你写的 "\d" 经字符串解析后变成 "\d",才传给 RegExp 构造函数。
立即学习“Java免费学习笔记(深入)”;
- 字面量写法
/\d+/更安全,反斜杠只被正则引擎解析一次 - 动态拼接正则时(比如用户输入关键词),必须双写反斜杠:
new RegExp("(" + keyword + ")", "g")→ 如果keyword含\或$,需额外转义 - 常见错误:
new RegExp("\b")实际传入的是退格符\x08,不是单词边界\b;应写成new RegExp("\\b")
真正难的不是写出一个能跑的正则,而是预判它在不同输入、不同方法、不同修饰符组合下的实际行为。尤其注意 lastIndex 状态残留、g 模式对 match() 返回值结构的破坏,以及字符串构造时的双重转义陷阱。











