JavaScript创建正则有字面量和RegExp构造函数两种方式:字面量如/abc/gi简洁高效但不支持动态拼接;构造函数new RegExp('abc','gi')可动态生成但需双重转义反斜杠,适用于变量或用户输入场景。

JavaScript 中创建正则表达式有两种标准方式:字面量语法和 RegExp 构造函数。它们在语法、行为和适用场景上有明显区别,选错可能导致意外错误(比如转义问题或动态构建失败)。
字面量写法:简洁固定,适合静态模式
用一对斜杠 /.../ 包裹模式,可选添加标志(如 i、g、m):
/abc/gi、/d{3}-d{4}/
注意:反斜杠在字面量中只需写一次,因为字符串解析阶段不参与——比如匹配一个反斜杠本身,写 /\/ 即可(第一个 转义第二个 )。
优点是书写直观、性能略优(编译一次,多次复用),但缺点是无法动态拼接内容。
RegExp 构造函数:支持动态生成,需双重转义
接受两个参数:模式字符串(必填)和标志字符串(可选):
new RegExp('abc', 'gi')、new RegExp('\d{3}-\d{4}')
关键细节:模式是字符串字面量,所以反斜杠要双重转义。例如想匹配 d,字符串中必须写成 '\d';想匹配单个反斜杠,得写成 '\\'(字符串解析后剩两个,正则引擎再解析为一个)。
适合从变量、用户输入或配置中构建正则,比如:const keyword = 'hello';<br>const re = new RegExp(`\b${keyword}\b`, 'i');
常见陷阱与建议
- 不要混用:避免用字面量写带变量的正则,也不要对已有的字面量正则再套
new RegExp()(会把对象转成字符串再解析,易出错) - 标志只能通过字面量末尾或构造函数第二参数指定,不能在模式里写(如
/(?i)abc/是合法的内联标志,但new RegExp('(?i)abc')也有效,只是可读性差) - 动态构造时,若来源不可信(如用户输入),务必先清洗或使用
escape-string-regexp类工具库防止注入 - 重复使用同一正则对象时,字面量和构造函数创建的实例都可复用,但注意全局标志
g下的lastIndex状态会保留,影响后续exec或test
简单对比速查
/a+b/g ⇔ new RegExp('a\+b', 'g')/s+d+/ ⇔ new RegExp('\s+\d+')/[a-z]{2,}/i ⇔ new RegExp('[a-z]{2,}', 'i')
静态就用字面量,要拼接就用 RegExp 构造函数,记牢转义层级即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











