首页/开发/正则与编码速查/JS 正则字面量与构造器差异

JS 正则字面量与构造器差异

JS 正则的字面量在解析期确定、反斜杠写一个、不能插入变量;构造器在运行时求值、字符串里反斜杠要写两个、适合动态模式但必须自行转义元字符。构造器复制已有正则时不继承状态,非法模式会在调用时抛错。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​‌​‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌‌​​​​​​‌​‌‌​‌​‌‌​‌‌​​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​‌‌​​​​‌​‌‌​‌​‌‌‌​‌‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌‌​‌​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

JS 正则字面量与构造器

两种创建方式的行为差异主要来自「字符串会先做一次转义解释」:字面量里写一个反斜杠就是正则语法,构造器的字符串参数里则要写两个。另一个差异是时机与灵活性:字面量在解析阶段就能确定,写得简洁但无法插入变量;构造器在运行时求值,适合把变量拼进模式,代价是需要自己做转义。

基本信息

字面量斜杠包裹模式,标志直接跟在后面,反斜杠写一个
构造器字符串作为模式,反斜杠要写两个,标志作为第二个参数
对象创建时机字面量每次求值都会产生新对象,构造器每次调用同样产生新对象
可复用性把正则存进变量后多次使用,会共享同一个对象及其状态

典型使用场景

  • 固定规则:写死的校验与提取模式用字面量最直观,也便于静态检查
  • 动态模式:分隔符来自配置或用户选择时用构造器拼接
  • 规则服务:从后端读取模式字符串后用构造器创建,需要捕获非法模式异常
  • 复制与改写:基于已有正则创建新对象后再改标志,注意状态复位问题
  • 测试用例:字面量便于在断言里直接书写,减少转义层数

创建方式与差异

创建方式与差异
const a = /ab+/gi;                       // 字面量:反斜杠写一个
const b = new RegExp('ab+', 'gi');       // 构造器:字符串参数
const c = new RegExp('\\d{4}');           // 想匹配四位数字,字符串里要写双反斜杠
const d = new RegExp(`^${prefix}\\d+$`);   // 动态拼接时必须转义变量中的元字符
try { new RegExp('(') } catch (e) {       // 非法模式抛语法错误
  console.error('模式非法', e.message)
}
// 复用同一个对象时状态会被保留,需要遍历时优先用无状态写法
const g = /a/g; g.test('aa'); g.test('aa');   // 两次调用结果不同

两种方式对照

对比项字面量构造器
反斜杠写法写一个写两个
插入变量不支持支持,需自行转义
创建时机解析阶段即可确定运行时求值
非法模式报错时机解析阶段即抛错调用时抛错
可读性固定规则更清晰动态规则唯一选择
把变量拼进模式前必须转义其中的元字符,否则用户输入里的点号、星号、括号会改变整条模式的语义,形成注入式问题;标准是否已提供内置转义接口取决于目标运行时版本,使用前先确认兼容性。
用已有正则对象作为构造器参数时可以复制模式与标志,但状态不会一并继承:新对象的起始位置是初始值,这一点在把带全局标志的正则交给改造逻辑时容易被忽略。

易错点

  • 构造器里漏写一层反斜杠:模式变成另一个含义或直接报非法,症状是「明明是同样的模式却匹配不到」
  • 拼接未经转义的用户输入:输入中的元字符改变匹配语义,属于注入类风险
  • 以为字面量每次复用都是新对象:把字面量结果存入变量后,多次调用会共享状态,遍历结果出现缺漏
  • 在循环里反复创建正则:每次都要编译,热点路径上应把对象提到循环外并注意状态复位
  • 模式字符串来自外部配置却不做校验:非法模式在请求路径上抛错,影响范围比启动期报错大得多

数据来源与参考

  • MDN:RegExp 构造器与正则字面量
  • ECMAScript 语言规范:RegExp 对象创建与模式语义
  • MDN:正则表达式语法中的转义规则

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/js-regexp-literal-vs-constructor.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​‌​‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌‌​​​​​​‌​‌‌​‌​‌‌​‌‌​​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​‌‌​​​​‌​‌‌​‌​‌‌‌​‌‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌‌​‌​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​