2016-01-04 63 views
4

我想從文件名稱中刪除尺寸數據,如比賽只使用Javascript正則表達式模式

var src = 'http://az648995.vo.msecnd.net/win/2015/11/Halo-1024x551.jpg'; 
src = src.replace(
    /-\d+x\d+(.\S+)$/, 
    function(match, contents, offset, s) { 
     return contents; 
    } 
); 

的最後一個實例可正常工作,我也得到

http://az648995.vo.msecnd.net/win/2015/11/Halo.jpg 

但是,如果我有像

http://az648995.vo.msecnd.net/win/2015/11/slot-Drake-08-2000x1000-1024x512.jpg 

一個文件名,它返回

http://az648995.vo.msecnd.net/win/2015/11/slot-Drake-08-1024x512.jpg 

,而不是預期的

http://az648995.vo.msecnd.net/win/2015/11/slot-Drake-08-2000x1000.jpg 

回答

5

你的正則表達式不起作用。一個未轉義的.匹配任何字符,但換行符。但是,\S與任何非空白字符匹配,包括.。除了不必要的回溯,你可能會得到一個意想不到的結果,像http://az648995.vo.msecnd.net/win/2015/11/slot-Drake-08-2000x1000-1024x512.MORE_TEXT_HERE.jpg這樣的字符串。

假設擴展是最後一個點後的字符串的一部分,你可以使用

-\d+x\d+(\.[^.\s]+)$ 

regex demo

的nagated字符類[^.\s]匹配任何字符,但空白和文字.符號。請注意,在替換內部使用回調函數沒有意義,您只能使用$1反向引用。

JS演示:

var src = 'http://az648995.vo.msecnd.net/win/2015/11/slot-Drake-08-2000x1000-1024x512.jpg'; 
 
src = src.replace(/-\d+x\d+(.[^.\s]+)$/, "$1"); 
 
document.body.innerHTML = src;

+1

捕獲組是一對圍繞在一對未轉義的括號中的模式。 '$ n'被稱爲替換反向引用。我使用regular-expressions.info中的術語,我認爲它最好地描述了NFA正則表達式引擎。 –

3

嘗試逃離.,你將被罰款:

/-\d+x\d+(\.\S+)$/ 
+3

僅供參考:'/ - \ d + X \ d +(\ \ S +)$ /'可能會返回,因爲'\ S'也意外的結果匹配'.'。 –

0

正則表達式可以簡化爲以下

更換

-\d+x\d+(\.\S+) 

隨着

$1 
2

稍微改變正則表達式是一個小更明確:如預期主要是(.\S+)$一部分轉義點,因爲

/-\d+x\d+(\.[^\s-]+)$/ 
相關問題