Javascript正则表达式字面量和构造函数之间的区别
Differences between Javascript regexp literal and constructor
我们最近遇到了一个bug,在一个开发人员将RegExp字面量更改为构造函数调用之后,我想知道为什么会有任何不同。确切的代码是
var parts = new RegExp("/rt:([^@]+)@('d+)/").exec(tag);
与
的原件var parts = /rt:([^@]+)@('d+)/.exec(tag);
当tag
为rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077
时,第一个(有bug的)调用返回null
,而第二个调用返回["rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]
不用说,我恢复了更改,但我想知道为什么会有这样的差异。
有两个问题:
/
是而不是表达式的部分。它们是分隔符,标记一个正则表达式文本。如果您使用RegExp
,则必须删除它们,否则它们将在字面上匹配斜杠。
其次,反斜杠是字符串字面量中的转义字符。要为表达式创建文字'
,必须在字符串中对其进行转义。
new RegExp("rt:([^@]+)@(''d+)")
特别是转义使表达式更难写,如果你想使用RegExp
。实际上,只有当您希望动态创建表达式时,也就是说,例如,如果您希望包含存储在变量中的文本,才需要使用它。如果您有一个固定的表达式,那么文字/.../
更容易编写,也更简洁。
'd
传递给new RegExp
构造函数时需要转义。所以它必须是
var parts = new RegExp("rt:([^@]+)@(''d+)").exec(tag);
相关文章:
- ES6构造函数返回基类的实例
- Jquery在函数之间传递表行
- JS构造函数的原型属性与其原型之间的区别
- 向构造函数或原型添加属性之间的区别
- 试图理解JavaScript中原型和构造函数之间的区别
- javascript中构造函数和对象之间的等价性
- JavaScript中带有构造函数的对象和闭包之间的区别
- Javascript - 这些构造函数之间有什么区别
- 构造函数中的方法与函数的原型属性之间的差异
- 在构造函数内部和外部定义公共方法之间有什么区别吗?
- 构造函数模式和原型模式之间的区别
- 在 JavaScript 中,构造函数和作为构造函数调用的返回对象的函数之间有什么区别
- instanceof和构造函数属性之间的差异
- 什么's使用instanceof和检查构造函数之间的区别
- 不同文件中构造函数之间的部分继承(JavaScript)
- Regex构造函数和字面量之间的反斜杠差异
- Javascript正则表达式字面量和构造函数之间的区别
- javascript构造函数之间的区别
- 构造函数之间的差异
- 在通过构造函数和对象字面语法创建对象之间进行选择