看代码:

var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc

function getFileExtension(filename) {
    /*TODO*/
}

当前回答

更新编辑:自从这个问题最初发布以来,很多事情都发生了变化——wallacer修改后的答案中有很多非常好的信息,VisioN也有很好的细分


编辑:因为这是公认的答案;Wallacer的回答确实好得多:

return filename.split('.').pop();

我以前的回答是:

return /[^.]+$/.exec(filename);

应该这么做。

编辑:在回应PhiLho的评论时,可以这样说:

return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;

其他回答

对于大多数应用程序,一个简单的脚本,如

return /[^.]+$/.exec(filename);

会工作得很好(由汤姆提供)。然而,这并非万无一失。如果提供了以下文件名,它将不起作用:

image.jpg?foo=bar

这可能有点过分,但我建议使用这样的url解析器来避免由于不可预测的文件名而导致的失败。

使用这个特定的函数,你可以得到这样的文件名:

var trueFileName = parse_url('image.jpg?foo=bar').file;

这将输出“image.jpg”,不带url变量。然后您就可以获取文件扩展名了。

return filename.replace(/\.([a-zA-Z0-9]+)$/, "$1");

编辑:奇怪的是(或者可能不是)替换方法的第二个参数中的$1似乎不工作…对不起。

使用reduce和数组解构来获取文件名和扩展名:

Var STR = "filename.with_dot.png"; Var [filename, extension] = str.split('.')。Reduce ((acc, val, i, arr) => (i == arr。长度- 1)?(acc [0] .substring (1), val]: [[acc [0], val] . join ('.')], []) console.log({文件名,扩展});

有更好的缩进:

var str = "filename.with_dot.png";
var [filename, extension] = str.split('.')
   .reduce((acc, val, i, arr) => (i == arr.length - 1) 
       ? [acc[0].substring(1), val] 
       : [[acc[0], val].join('.')], [])


console.log({filename, extension});

// {
//   "filename": "filename.with_dot",
//   "extension": "png"
// }

一行解决方案,也将考虑查询参数和url中的任何字符。

string.match(/(.*)\??/i).shift().replace(/\?.*/, '').split('.').pop()

// Example
// some.url.com/with.in/&ot.s/files/file.jpg?spec=1&.ext=jpg
// jpg
var filetypeArray = (file.type).split("/");
var filetype = filetypeArray[1];

在我看来,这是一个更好的方法。