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