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')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 属性,用于后续调用继续查找。这在全局模式下尤其容易出错。
g 标志且被多次调用,必须确保每次调用前 lastIndex === 0,否则可能漏匹配或死循环ex
ec(),除非你明确控制 lastIndex
match() 或重置:const re = /a/g;
re.lastIndex = 0; // 手动重置
re.exec('abac');
正则不是“越复杂越强”,很多问题其实靠简单模式+逻辑组合更稳。
. 默认不匹配换行符,需要 /s flag(ES2018+)才能让 . 匹配包括 \n 在内的所有字符u 标志时可能被拆成两个码元,导致 \w 或 \b 失效^ 和 $ 在 m 模式下才匹配每行开头/结尾,否则只匹配整个字符串首尾.*)可能导致回溯爆炸,长文本下卡顿甚至栈溢出