在下面的代码中我预计字符串' /?_ escaped_fragment _ = / 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//'
答案 0 :(得分:2)
?
匹配前面选择器的0或1。你需要用正则表达式的反斜杠转义?
,然后转义字符串的反斜杠:
var rule = new RegExp('\/\\?_escaped_fragment_=(.*)');
这些双重转义问题是在字符串文字中使用正则表达式语法的产物。也可以保存一些字符并使用正则表达式字面值:
var rule = /\/\?_escaped_fragment_=(.*)/;
答案 1 :(得分:1)
您必须转义?
,因为它表示前一个字符或组是可选的。
请参阅此Explanation on RegEx101.com:
\/?
字面匹配字符/
量词:
?
在零到一次之间,尽可能多次,根据需要回馈[贪婪]
这是您需要的RegEx:
var rule = new RegExp('/\\?_escaped_fragment_=(.*)');
注意:在RegExp
构造函数中,转义与\\
一起使用,而不是\
,因为双反斜杠被解析为传递给构造函数的字符串中的单个反斜杠然后正则表达式甚至有那个单反斜杠。如果只编写一个反斜杠,那么在将其解析为字符串时会消耗该反斜杠,从而导致正则表达式的 no 反斜杠。
此外,/
不需要以字符串形式进行转义,因为这会自动处理。
如果它仍然是静态的,你可以简单地使用RegEx文字:
var rule = /\/\?_escaped_fragment_=(.*)/;