JavaScript正则表达式是RegExp对象,创建方式有字面量(/pattern/flags)和构造函数(new RegExp('p','f')),前者编译早、性能好,后者支持动态生成;常用方法包括match、test、replace、split;exec()因lastIndex状态易出错,需谨慎重置或改用match;注意u标志处理Unicode、s标志使.匹配换行符、m标志改变^$含义,避免贪婪量词引发回溯爆炸。

JavaScript 正则表达式是内置的模式匹配工具,本质是一个 RegExp 对象,用来描述、查找、替换符合特定规则的字符串。
怎样创建正则表达式?
两种方式:字面量语法和构造函数。区别在于编译时机和动态性。
- 字面量写法:
/pattern/flags,如/abc/g,在代码解析时就编译,性能好,但无法拼接变量 - 构造函数写法:
new RegExp('pattern', 'flags'),运行时编译,支持动态生成,但注意反斜杠要双写(如匹配\d得写成'\\d') - 常见 flags:
g(全局)、i(忽略大小写)、m(多行模式)、u(Unicode 模式,处理 emoji 或中文更可靠)
常用匹配方法有哪些?
String.prototype 提供了多个直接操作正则的方法,比手动调用 RegExp.prototype.exec() 更常用。
-
str.match(/pattern/g):返回匹配数组,无匹配时返回null;加g返回所有结果,不加只返回第一个及捕获组信息 -
str.test(/pattern/):返回布尔值,适合条件判断,比如表单校验 -
str.replace(/pattern/, 'newStr'):支持字符串或函数作为替换值;若 pattern 无g,只替换第一个 -
str.split(/pattern/):按正则切分字符串,比如用/\\s+/拆分连续空白
为什么 exec() 会重复返回同一结果?
因为 exec() 是有状态的——它会修改正则实例的 lastIndex 属性,用于后续调用继续查找。这在全局模式下尤其容易出错。
立即学习“Java免费学习笔记(深入)”;
- 如果正则带
g标志且被多次调用,必须确保每次调用前lastIndex === 0,否则可能漏匹配或死循环 - 避免复用同一个正则实例做多次
exec(),除非你明确控制lastIndex - 更安全的做法是改用
match()或重置:const re = /a/g;
re.lastIndex = 0; // 手动重置
re.exec('abac');
容易忽略的细节
正则不是“越复杂越强”,很多问题其实靠简单模式+逻辑组合更稳。
-
.默认不匹配换行符,需要/sflag(ES2018+)才能让.匹配包括\n在内的所有字符 - 中文、emoji 等 Unicode 字符,在未启用
u标志时可能被拆成两个码元,导致\w或\b失效 - 正则中的
^和$在m模式下才匹配每行开头/结尾,否则只匹配整个字符串首尾 - 过度使用贪婪量词(如
.*)可能导致回溯爆炸,长文本下卡顿甚至栈溢出











