2015-09-01 41 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

相關問題