截取文件名的扩展名

4

我有一个文件名列表,例如:

index.min.html
index.dev.html
index.min.js
index.dev.js
There.are.also.files.with.multiple.dots.and.other.extension

我想要截取文件名的扩展名,但问题在于我只能使用 match 来完成这个任务。
我尝试了许多正则表达式,比如 "index.min.html".match( /^((?!:(\.[^\.]+$)).+)/gi ); 以选取最后一个点和扩展名之前的文件名,但它们选择整个文件名、什么都不选或第一个点之前的部分。有没有一种方法可以只选择没有扩展名的文件名?

1
你能解释一下为什么必须使用 match 吗? - marionebl
5个回答

13

为什么要使用正则表达式?简单的子字符串表达式可以使这个过程变得更简单:

var filename = 'index.something.js.html';

alert(filename.substr(0, filename.lastIndexOf(".")));

3

我会选择

/(.+)\..+$/mi

演示 @ regex101

请查看演示,特别是匹配结果。它只会给出文件名,不包括最后一个.和其后面的字符。


这个可以工作,但是当我使用 foo.bar.something.else".match(/(.+)\..+$/mi); 时,它应该返回没有扩展名的文件名。 - Cubi73
@Cubinator73,使用正则表达式是不可能实现的。match方法总是返回...嗯...匹配项。对于您的情况,您始终需要匹配完整名称并捕获有趣的部分。因此,没有扩展名的文件名只是包含在一个捕获组中,您可以在匹配上访问该组。当您在浏览器控制台中运行您发布的匹配时,您将看到match[1]是您想要获取的部分(foo.bar.something)。match[0]始终是整个匹配,而每个index > 0都是捕获组。 - KeyNone

3

这也可以,但是正如我对Basti M说的那样,当我使用foo.bar.something.else".match(/(.*)\.[^\.]+/gi);时,它应该返回没有扩展名的文件名。 - Cubi73

1

一个更简单的解决方案是仅剪切掉最后一个元素:

var a = "index.min.html";
var b = a.split('.').slice(0, -1).join('.');

或者,更好的方法是使用JavaScript的String函数substr:
var b = a.substr(0, a.lastIndexOf("."));

为什么你必须使用match

1
这也很好用。Paddy的更短,但还是谢谢你。 :) - Cubi73

0

这个也可能行:

function baseName(str) {
    if (typeof str !== 'string') return;
    var frags = str.split('.')
    return frags.splice(0,frags.length-1).join('.');    
}

Repl:http://repl.it/OvI

jsPerf: http://jsperf.com/string-extension-splits

测试结果:

substr 是该线程中最快的选项。感谢其他的小伙伴。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接