以下正则表达式
var patt1=/[0-9a-z]+$/i;
提取字符串的文件扩展名,例如
filename-jpg
filename#gif
filename.png
如果字符串确实是一个带有一个点作为分隔符的文件名,如何修改此正则表达式只返回一个扩展名? (显然文件名#gif不是常规文件名)
更新根据tvanofsson的评论我想澄清一下,当JS函数收到字符串时,字符串将包含一个没有空格的文件名,没有点和其他特殊字符(实际上它将被处理为{{ 1}})。问题不在于解析文件名,而是在错误地解析slugs - 函数返回了“jpg”的扩展名,当它被赋予“filename-jpg”时,它应该真正返回slug
或空字符串,这就是这种行为需要纠正的问题。
答案 0 :(得分:55)
只需将.
添加到正则表达式
var patt1=/\.[0-9a-z]+$/i;
因为点是正则表达式中的特殊字符,所以您需要将其转义为字面匹配:\.
。
您的模式现在将匹配任何以点结尾的字符串,后跟[0-9a-z]
中的至少一个字符。
[
"foobar.a",
"foobar.txt",
"foobar.foobar1234"
].forEach( t =>
console.log(
t.match(/\.[0-9a-z]+$/i)[0]
)
)
如果您想将扩展名限制为一定数量的字符,则需要替换+
var patt1=/\.[0-9a-z]{1,5}$/i;
在点之后允许至少1个,最多5个字符。
答案 1 :(得分:41)
尝试
var patt1 = /\.([0-9a-z]+)(?:[\?#]|$)/i;
此RegExp对于从URL中提取文件扩展名非常有用 - 即使是具有?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。 +1 @stema offers pretty good advice对所涉及的一些RegExp语法基础知识。
答案 2 :(得分:11)
示例列表:
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
答案 3 :(得分:0)
ONELINER:
let ext = (filename.match(/\.([^.]*?)(?=\?|#|$)/) || [])[1]
以上解决方案包括链接。 egzamples(文件名-> ext):
// "abcd.Ef1" -> "Ef1"
// "abcd.efg" -> "efg"
// "abcd.efg?aaa&a?a=b#cb" -> "efg"
// "abcd.efg#aaa__aa?bb" -> "efg"
// "abcd" -> undefined
// "abcdefg?aaa&aa=bb" -> undefined
// "abcdefg#aaa__bb" -> undefined
它接受最后一个点与第一个“ ?
”或“ #
”字符或字符串末尾之间的所有内容。要忽略“ ?
”和“ #
”字符,请使用/\.([^.]*)$/
。要仅忽略“ #
”,请使用/\.([^.]*?)(?=\?|$)/
。