用于匹配/解压缩文件扩展名的Javascript正则表达式

mar*_*are 32 javascript regex

以下正则表达式

var patt1=/[0-9a-z]+$/i;
Run Code Online (Sandbox Code Playgroud)

提取字符串的文件扩展名,例如

filename-jpg
filename#gif
filename.png
Run Code Online (Sandbox Code Playgroud)

如果字符串确实是一个带有一个点作为分隔符的文件名,如何修改此正则表达式只返回一个扩展名?(显然文件名#gif不是常规文件名)

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

ste*_*ema 61

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

var patt1=/\.[0-9a-z]+$/i;
Run Code Online (Sandbox Code Playgroud)

因为点是正则表达式中的特殊字符,所以你需要将其转义为字面上匹配:\..

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

例:

[
  "foobar.a",
  "foobar.txt",
  "foobar.foobar1234"
].forEach( t => 
  console.log(
    t.match(/\.[0-9a-z]+$/i)[0]
  ) 
)
Run Code Online (Sandbox Code Playgroud)


如果你想将扩展名限制为一定数量的字符,那么你需要更换 +

var patt1=/\.[0-9a-z]{1,5}$/i;
Run Code Online (Sandbox Code Playgroud)

在点之后允许至少1个,最多5个字符.


Már*_*son 43

尝试

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

此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"]
Run Code Online (Sandbox Code Playgroud)

@stema的PS +1为所涉及的一些RegExp语法基础提供了很好的建议.


小智 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
Run Code Online (Sandbox Code Playgroud)

测试页面.


Kam*_*ski 5

单线:

let ext = (filename.match(/\.([^.]*?)(?=\?|#|$)/) || [])[1] 
Run Code Online (Sandbox Code Playgroud)

以上解决方案包括链接。它需要最后一个点和第一个“ ?”或“ #”字符或字符串结尾之间的所有内容。要忽略 " ?" 和 " #" 字符,请使用/\.([^.]*)$/. 要仅忽略“ #”,请使用/\.([^.]*?)(?=\?|$)/. 例子

function getExtension(filename) {
  return (filename.match(/\.([^.]*?)(?=\?|#|$)/) || [])[1];
}


// TEST
[
  "abcd.Ef1",
  "abcd.efg",
  "abcd.efg?aaa&a?a=b#cb",
  "abcd.efg#aaa__aa?bb",
  "abcd",
  "abcdefg?aaa&aa=bb",
  "abcdefg#aaa__bb",
].forEach(t=> console.log(`${t.padEnd(21,' ')} -> ${getExtension(t)}`))
Run Code Online (Sandbox Code Playgroud)