2016-01-04 36 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-]+)$/ 
相关问题