2011-07-05 251 views
22

下面的正则表达式的Javascript正则表达式匹配/解压文件扩展名

var patt1=/[0-9a-z]+$/i; 

提取字符串,例如

filename-jpg 
filename#gif 
filename.png 

如何修改这个正则表达式只返回一个扩展名,当串真正的文件扩展名是一个点作为分隔符的文件名? (显然文件名#GIF不是普通文件名)

UPDATE基于tvanofsson的评论我想澄清的是,当JS函数接收到字符串时,字符串将已经包含一个文件名,没有空格,没有点和其他特殊字符(它实际上将被处理为slug)。问题不在于解析文件名,而在于错误地解析了slug - 当函数返回null或者空字符串时,该函数返回了“jpg”的扩展名,当它被赋予“filename-jpg”时,这是需要的行为纠正。

+3

是否正则表达式必须确定文件名是否是合法文件名?什么定义了合法的文件名?什么定义了合法的文件扩展名?例如,是'foo吧。zi_'合法的文件名? 'foo.bar.zi_'怎么样? – tvanfosson

+0

典型的操作系统文件名..你的例子与它的空间不能发生在我们的系统和@stema提供的答案似乎与双扩展工作,所以这对我来说已经足够了。 – mare

+1

这两个示例都是Unix和Windows中的合法文件名。你的问题可以通过详细说明你认为是合法的文件名来改进。它会做出答案,尤其是。接受的答案对未来可能寻求解决相同或类似问题的读者更有意义。 – tvanfosson

回答

44

只需添加一个.的正则表达式

var patt1=/\.[0-9a-z]+$/i; 

因为点是正则表达式,你需要逃避它从字面上与之相匹配的特殊字符:\.

您的模式现在将匹配任何以点结尾的字符串,后面跟着至少一个来自[0-9a-z]的字符。

例如

foobar.a
foobar.txt
foobar.foobar1234

如果要限制扩展到一定数目的字符也比你需要更换 +

var patt1=/\.[0-9a-z]{1,5}$/i; 

将允许点后至少1个,最多5个字符。

+0

如果我不需要我的比赛中的点,只是扩展名只有? – user2727195

+0

@ user2727195如果没有点,则表示不匹配扩展名。如果你的意思是...你如何只使用结果文本,那么你可以使用substring,就像这样:'((“file.ext”)。match(patt1)||'').substring(1);' – Armstrongest

34

尝试

var patt1 = /\.([0-9a-z]+)(?:[\?#]|$)/i; 

这个正则表达式是从网址提取文件扩展名有用的 - 甚至是那些具有?foo=1查询字符串和#hash结局。

它也将为您提供扩展名为$1

var m1 = ("filename-jpg").match(patt1); 
alert(m1); // null 

var m2 = ("filename#gif").match(patt1); 
alert(m2); // null 

var m3 = ("filename.png").match(patt1); 
alert(m3); // [".png", "png"] 

var m4 = ("filename.txt?foo=1").match(patt1); 
alert(m4); // [".txt?", "txt"] 

var m5 = ("filename.html#hash").match(patt1); 
alert(m5); // [".html#", "html"] 

P.S.对于@stema而言,+1对于涉及一些RegExp语法基础的offers pretty good advice

+0

谢谢兄弟:-) – ianaz

7

实施例列表:

var fileExtensionPattern = /\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/gmi 
//regex flags -- Global, Multiline, Insensitive 

var ma1 = 'css/global.css?v=1.2'.match(fileExtensionPattern)[0]; 
console.log(ma1); 
// returns .css 

var ma2 = 'index.html?a=param'.match(fileExtensionPattern)[0]; 
console.log(ma2); 
// returns .html 

var ma3 = 'default.aspx?'.match(fileExtensionPattern)[0]; 
console.log(ma3); 
// returns .aspx 

var ma4 = 'pages.jsp#firstTab'.match(fileExtensionPattern)[0]; 
console.log(ma4); 
// returns .jsp 

var ma5 = 'jquery.min.js'.match(fileExtensionPattern)[0]; 
console.log(ma5); 
// returns .js 

var ma6 = 'file.123'.match(fileExtensionPattern)[0]; 
console.log(ma6); 
// returns .123 

Test page

相关问题