例如,假设x = filename.jpg,我想要获取filename,其中filename可以是任何文件名(为了简化,我们假设文件名只包含[a-zA-Z0-9-_])。

我看到x.substring(0, x.indexOf('.jpg'))在DZone片段上,但x.substring(0, x.length-4)不会表现更好吗?因为,length是一个属性,不做字符检查,而indexOf()是一个函数,做字符检查。


当前回答

即使在字符串中不存在分隔符时,这也是有效的。

String.prototype.beforeLastIndex = function (delimiter) {
    return this.split(delimiter).slice(0,-1).join(delimiter) || this + ""
}

"image".beforeLastIndex(".") // "image"
"image.jpeg".beforeLastIndex(".") // "image"
"image.second.jpeg".beforeLastIndex(".") // "image.second"
"image.second.third.jpeg".beforeLastIndex(".") // "image.second.third"

也可以像这样作为一行代码使用:

var filename = "this.is.a.filename.txt";
console.log(filename.split(".").slice(0,-1).join(".") || filename + "");

编辑:这是一个更有效的解决方案:

String.prototype.beforeLastIndex = function (delimiter) {
    return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
}

其他回答

我将使用类似x.substring(0, x.lastIndexOf('.'))的东西。如果你追求的是性能,那就不要用javascript:-p不,多一条语句对于99.99999%的目的来说真的没什么关系。

name.split('.').slice(0, -1).join('.')

这就是所有的享受你的编码…

我们可能会遇到具有多个扩展名后缀的文件名或文件路径。考虑以下方法来修剪它们。

text = "/dir/path/filename.tar.gz"    
output = text.replace(/(\.\w+)+$/,"")

输出结果:"/dir/path/filename"

它解决了文件扩展的问题,特别是当输入有多个扩展名时。

在node.js中,不带扩展名的文件名可以通过如下方式获取。

const path = require('path');
const filename = 'hello.html';
    
path.parse(filename).name;     //=> "hello"
path.parse(filename).ext;      //=> ".html"
path.parse(filename).base; //=> "hello.html"

进一步的解释在Node.js文档页。

另一个一行程序:

x.split(".").slice(0, -1).join(".")