2015-09-01 43 views
-1

在下面的代码中,我期望字符串'/?_ escaped_fragment _ =/faq'被转换为'/ seo/faq'。Javascript替换正则表达式不按预期工作

取而代之,我得到'/?/ seo/faq'。代码有什么问题?

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

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

http://jsfiddle.net/wLfuuw1p/5/

+4

'?'在正则表达式中有特殊含义。转义它,并使用正则表达式而不是'RegExp'构造函数。 – Ryan

回答

1

你必须逃离?,因为它意味着前一个字符或一组是可选的。

请参阅本Explanation on RegEx101.com

\/?匹配字符/字面上

量词:?之间的零和一的时间,尽可能,用之于根据需要多次[贪婪]

这是您需要的RegEx:

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

注:在RegExp构造,逃避与\\的作品,而不是与\,因为双反斜线被解析为字符串中一个反斜杠,你传递给构造函数,然后才正则表达式甚至有单个反斜杠。如果只写一个反斜杠,那么在将其解析为字符串时会消耗该反斜杠,从而导致正则表达式的反斜杠no

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

如果它的将是静态的,无论如何,你可以简单地使用文字正则表达式:

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

为什么不只是写一个文字正则表达式,所以你不必担心双重逃跑?另外,**如果**你将要传递一个字符串到正则表达式的构造函数,那么不需要转义正斜杠。 –

+0

为什么双反斜杠? – wildbyte

+0

如果正则表达式是动态的,@torazaburo'new RegExp'非常有用。我不确定OP的完整意图。 – Xufox

2

?匹配0或前面选择的1。你需要躲避?与正则表达式的反斜杠,然后转义反斜线的字符串:

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

这些双重逃避问题是使用字符串字面内正则表达式语法的产物。不妨保存几个字符并使用正则表达式:

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

为什么不直接写一个文字正则表达式? –

+0

@torazaburo,给我一分钟,我到了那里。 – zzzzBov

相关问题