比如,假设 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()
是一个函数,会进行字符检查。
如果您需要处理包含完整路径的变量(例如:thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"
),并且您只想返回“filename”,您可以使用以下代码:
var filename = thePath.substring(thePath.lastIndexOf("/") + 1);
theName = thePath.split("/").slice(-1).join().split(".").shift();
结果将会是theName == "filename";
为了尝试它,请在Chrome调试器的控制台窗口中输入以下命令:window.location.pathname.split("/").slice(-1).join().split(".").shift()
如果你只需要处理文件名和扩展名(例如:theNameWithExt = "filename.jpg"
):
theName = theNameWithExt.split(".").shift();
结果将会是theName == "filename",与上面的相同;
但是我无法对与其他答案的性能比较或浏览器或操作系统兼容性做出任何评论。
working snippet 1: the complete path
var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg";
theName = thePath.split("/").slice(-1).join().split(".").shift();
alert(theName);
working snippet 2: the file name with extension
var theNameWithExt = "filename.jpg";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
working snippet 2: the file name with double extension
var theNameWithExt = "filename.tar.gz";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
filename.replace(/\.[^.$]+$/, '');
这应该只去掉最后一段。
简单易懂:
var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"
path/name.ext
-> paht/name
,而不仅仅返回name
,但我宁愿使用fs.parse
,尽管它有点冗长:https://dev59.com/KW855IYBdhLWcg3wm1m3#59576950 - Ciro Santilli OurBigBook.comfilename.slice(0, -'.zip'.length)
或者 filename.slice(0, -extension.length)
。 - Nick Grealy被接受的答案仅剥离最后一个扩展名部分(.jpeg
),在大多数情况下这可能是一个不错的选择。
我曾经需要剥离所有扩展名(.tar.gz
),并且文件名限制不包含点(因此 2015-01-01.backup.tar
不会成为问题):
var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");
const path = require("path")
const image=xyz.jpg;
const img= path.parse(image).name
console.log(img) // xyz
Node.js去除完整路径中的扩展名并保留目录
例如https://dev59.com/KW855IYBdhLWcg3wm1m3#31615711所示,将path/hello.html
转换成hello
,但如果您想将path/hello.html
转换成path/hello
,可以使用以下代码:
#!/usr/bin/env node
const path = require('path');
const filename = 'path/hello.html';
const filename_parsed = path.parse(filename);
console.log(path.join(filename_parsed.dir, filename_parsed.name));
同时输出目录:
path/hello
https://dev59.com/KW855IYBdhLWcg3wm1m3#36099196也可以实现这个功能,但是我认为这种方法更加语义化。
在Node.js v10.15.2中进行了测试。
虽然有点晚了,我会添加另一种使用普通旧JS获取没有扩展名的文件名的方法 -
path.replace(path.substr(path.lastIndexOf('.')), '')
path.split('.').pop()
。 - mixdev我们可能会遇到带有多个扩展名后缀的文件名或文件路径。考虑以下方法来修剪它们。
text = "/dir/path/filename.tar.gz"
output = text.replace(/(\.\w+)+$/,"")
输出结果:"/dir/path/filename"
当输入具有多个扩展名时,它可以解决文件扩展名问题。
这是我用来从文件名中删除扩展名的代码,而不使用正则表达式或indexOf(在IE8中不支持indexOf)。它假设扩展名是最后一个“.”字符之后的任何文本。
它适用于:
以下是代码:
var filename = "my.letter.txt" // some filename
var substrings = filename.split('.'); // split the string at '.'
if (substrings.length == 1)
{
return filename; // there was no file extension, file was something like 'myfile'
}
else
{
var ext = substrings.pop(); // remove the last element
var name = substrings.join(""); // rejoin the remaining elements without separator
name = ([name, ext]).join("."); // readd the extension
return name;
}
hello.tar.gz
,输出为 hellotar
。 - Asif Ali