比如,假设 x = filename.jpg
,我想要得到 filename
,其中filename
可以是任何文件名(为了简化,我们假设文件名只包含 [a-zA-Z0-9-_])。
我在DZone Snippets上看到了 x.substring(0, x.indexOf('.jpg'))
,但是 x.substring(0, x.length-4)
会更好吗?因为 length
是一个属性,不进行字符检查,而 indexOf()
是一个函数,会进行字符检查。
比如,假设 x = filename.jpg
,我想要得到 filename
,其中filename
可以是任何文件名(为了简化,我们假设文件名只包含 [a-zA-Z0-9-_])。
我在DZone Snippets上看到了 x.substring(0, x.indexOf('.jpg'))
,但是 x.substring(0, x.length-4)
会更好吗?因为 length
是一个属性,不进行字符检查,而 indexOf()
是一个函数,会进行字符检查。
不确定哪种方法更快,但是在涉及像.jpeg
或.html
这样的扩展名时,这种方法会更加可靠。
x.replace(/\.[^/.]+$/, "")
在 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 文档 以了解更多。
var parsed = path.parse(filename)
,然后执行path.join(parsed.dir, parsed.name)
。 - Jespertheendlet base = path.basename( file_path, path.extname( file_path ) )
。 - bicarlsenx.slice(0, -4)
(其中4是扩展名和句点的三个字符)。filename.split('.').slice(0, -1).join('.')
请注意,它将无法处理没有扩展名的文件。
"picture.jpeg".slice(0, -4)
-> "picture." - basic6x.length-4
只考虑到3个字符的扩展名。那如果你有 filename.jpeg
或者 filename.pl
呢?.jpg
扩展名,x.length-4
也完全可以使用。x = x.replace(/\..+$/, '');
或者
x = x.substring(0, x.lastIndexOf('.'));
或者
x = x.replace(/(.*)\.(.*?)$/, "$1");
或者(假设文件名只有一个点)parts = x.match(/[^\.]+/);
x = parts[0];
或(也可以只有一个点)
parts = x.split(".");
x = parts[0];
split('.')[0]
将只返回部分文件名。我建议在答案中删除这个例子,或者明确表示出这个例子存在的问题。@basarat... - Roko C. Buljansubstr
和substring
的作用是相同的。请参考:https://dev59.com/f2865IYBdhLWcg3wkfgW - Jeff Bsubstring
的第二个参数是 indexEnd
,而 substr
则需要 length
,所以在我看来,substring
更适合这里。 - Dziad Borowyx = x.substring(0, x.lastIndexOf('.'));
这是我的选择。谢谢! - Leonid Zadorozhnykh我喜欢这个代码,因为它只有一行,不难阅读:
filename.substring(0, filename.lastIndexOf('.')) || filename
你可以尝试利用假设最后一个句点是扩展名分隔符的方法。
var x = 'filename.jpg';
var f = x.substr(0, x.lastIndexOf('.'));
如果文件没有扩展名,它将返回空字符串。使用此函数可以解决该问题。
function removeExtension(filename){
var lastDotPosition = filename.lastIndexOf(".");
if (lastDotPosition === -1) return filename;
else return filename.substr(0, lastDotPosition);
}
var f = x.substr(0, x.lastIndexOf('.')) || x;
。它之所以有效是因为空字符串是假值,所以会返回x。 - Jonathan RownyString.prototype.substr()
已被弃用,请使用String.prototype.slice()
或String.prototype.substring()
。文档可以在这里找到。 - nCr78path.basename(filename, path.extname(filename))
当然,在 0.12.x 及更高版本中也适用。path.parse
的答案更简单。 - Dan Dascalescu我不知道这是否是一个有效的选项,但我使用了这个:
name = filename.split(".");
// trimming with pop()
name.pop();
// getting the name with join()
name.join('.'); // we split by '.' and we join by '.' to restore other eventual points.
我知道这不只是一次操作,但至少它应该始终有效!
更新:如果您想要一行代码,请看这里:
(name.split('.').slice(0, -1)).join('.')
hello.name.txt
返回hello, name
。 - Evil即使分隔符不在字符串中,此方法也有效。
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.split(".").slice(0, -1).join(".")