Javascript替换正则表达式未按预期工作

Javascript替换正则表达式未按预期工作,javascript,regex,Javascript,Regex,在下面的代码中,我希望字符串“/?\u转义\u片段\=/faq”转换为“/seo/faq” 相反,我得到的是“/?/seo/faq”。代码有什么问题 var url = '/?_escaped_fragment_=/'; var rule = new RegExp('\/?_escaped_fragment_=(.*)'); alert(url.replace(rule,'/seo/$1')); // this shows up '/?/seo//' 您必须转义?,因为它表示前面的字符或组是

在下面的代码中,我希望字符串“/?\u转义\u片段\=/faq”转换为“/seo/faq”

相反,我得到的是“/?/seo/faq”。代码有什么问题

var url = '/?_escaped_fragment_=/';
var rule = new RegExp('\/?_escaped_fragment_=(.*)');

alert(url.replace(rule,'/seo/$1')); // this shows up '/?/seo//'

您必须转义
,因为它表示前面的字符或组是可选的

请参阅:

\/?
按字面意思匹配字符
/

量词:
在零到一次之间,尽可能多地返回,根据需要返回[贪婪]

这是您需要的正则表达式:

var rule = new RegExp('/\\?_escaped_fragment_=(.*)');
注意:在
RegExp
构造函数中,转义与
\\
一起工作,而与
\
不一起工作,因为双反斜杠被解析为传递给构造函数的字符串中的单个反斜杠,只有在正则表达式中才有该单个反斜杠。如果只写一个反斜杠,则在将其解析为字符串时会使用该反斜杠,从而导致正则表达式没有反斜杠

另外,
/
不需要以字符串形式转义,因为这是自动处理的

如果它是静态的,您可以简单地使用正则表达式:

var rule = /\/\?_escaped_fragment_=(.*)/;
var rule = /\/\?_escaped_fragment_=(.*)/;

匹配前面选择器的0或1。您需要使用正则表达式的反斜杠转义
,然后转义字符串的反斜杠:

var rule = new RegExp('\/\\?_escaped_fragment_=(.*)');
这些双重转义问题是在字符串文本中使用正则表达式语法的结果。还可以保存几个字符并使用正则表达式文字:

var rule = /\/\?_escaped_fragment_=(.*)/;
var rule = /\/\?_escaped_fragment_=(.*)/;

在正则表达式中有特殊含义。转义它,使用一个regex文本而不是
RegExp
构造函数。为什么不写一个文本RegExp?@torazaburo,给我一分钟,我就到了。为什么不写一个文本RegExp,这样你就不用担心双重转义了?此外,如果要将字符串传递给regexp构造函数,则无需转义正斜杠。为什么要使用双反斜杠?@torazaburo
new regexp
在正则表达式是动态的情况下非常有用。我不确定OP的全部意图。@torazaburo正斜杠你说得对,我已经编辑了我的帖子。@wildbyte双反斜杠被解析为字符串中的单个反斜杠,只有这样正则表达式才能解析该单个反斜杠。如果只写一个反斜杠,则会使用一个反斜杠将其转换为字符串,从而导致正则表达式没有反斜杠。