我们最近遇到了一个错误,一位开发人员将 RegExp 文字更改为构造函数调用,我想知道为什么会有任何差异。 确切的代码是
var parts = new RegExp("/rt:([^@]+)@(\d+)/").exec(tag);
与原来的
var parts = /rt:([^@]+)@(\d+)/.exec(tag);
何时 tag
例如 rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077
,第一个(有问题的)调用返回 null
,而第二个返回 ["rt:60C1C036-42FA-4073-B10B-1969BD2358FB@00000000077", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]
不用说,我恢复了更改,但我想知道为什么会有这样的差异。
最佳答案
有两个问题:
/
不是表达式的一部分。它们是分隔符,标记正则表达式文字。如果您使用 RegExp
,则必须删除它们,否则它们会按字面意思匹配斜杠。
其次,反斜杠是字符串文字中的转义字符。要为表达式创建文字 \
,您必须在字符串中对其进行转义。
因此,等价物是:
new RegExp("rt:([^@]+)@(\\d+)")
<小时/>
特别是,如果您想使用 RegExp
,转义会使表达式的编写变得更加困难。实际上,仅当您想要动态创建表达式时才需要它,也就是说,例如,如果您想要包含存储在变量中的文本。如果您有固定的表达式,则文字 /.../
更容易编写且更简洁。
关于javascript - Javascript 正则表达式文字和构造函数之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7964916/