Regex——为什么在使用新的RegExp方法时这个模式不能工作?

Regex - Why doesn't this pattern work when using the new RegExp method?

本文关键字:模式 不能 工作 方法 RegExp 为什么 Regex      更新时间:2023-09-26

我正在搜索这个字符串的'invite=XXXX'部分。我使用捕获组来提取'='和';'之间的值。当我使用第一个regex方法它工作,但当我使用第二个它不。为什么会这样?

var string = "path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; invite=1323969929057; path=/; expires=Sat, 14 Jan 2012 17:25:29 GMT;";
// first method
var regex1 = /invite=('w+)/;
var regexMatch1 = string.match(regex1);
// second method
var regex2 = new RegExp("/invite=('w+)/");  
var regexMatch2 = string.match(regex2);
// log results
console.log(regexMatch1);
console.log(regexMatch2);

这里的工作示例>>

你必须转义',并且像Jake说的那样,去掉斜杠。

var regex2 = new RegExp("invite=(''w+)");  
                                  ^ Notice 2 "'"
http://jsfiddle.net/ZqkQ9/10/

使用RegExp()构造函数时,不需要斜杠。改成:

var regex2 = new RegExp("invite=(''w+)"); 

因为/是用于正则表达式文字的。由于您正在使用RegExp对象,因此需要删除斜杠。您还需要转义反斜杠,因为您没有使用文字:

var regex2 = new RegExp("invite=(''w+)");  
var regexMatch2 = string.match(regex2);

应该是:

 var regex2 = new RegExp("invite=(''w+)");  

字符串形式的正则表达式没有/前缀和后缀,所有转义字符必须是''而不是'

使用RegExp创建RegExp对象时不需要斜杠。

如果你愿意,你甚至可以使用RegExp.source

比较模式

试试console.log(regex1.source === regex2.source)

参考:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp

从RegExp构造函数中删除/'s,转义'w并放入第二个参数:

var regex2 = new RegExp("invite=(''w+)", "");