x = filename.jpg
,我想获得filename
,其中filename
可以是任何文件名(为简化起见,假设文件名仅包含[a-zA-Z0-9-_]。)。我在DZone片段上看到了
x.substring(0, x.indexOf('.jpg'))
,但是x.substring(0, x.length-4)
的效果会更好吗?因为,length
是一个属性并且不进行字符检查,而indexOf()
是一个函数并且进行字符检查。#1 楼
如果知道扩展名的长度,则可以使用x.slice(0, -4)
(其中4是扩展名和点的三个字符)。如果您不知道扩展名,则@John Hartsock regex是正确的方法。
如果不想使用正则表达式,可以尝试使用这种方法(性能较低):
filename.split('.').slice(0, -1).join('.')
请注意,它将在没有扩展名的文件上失败。
评论
我最喜欢这种解决方案。它很干净,我可以使用它,因为我知道文件扩展名始终是.jpg。我正在寻找Ruby的x [0 ..- 5]之类的东西,而x.slice(0,-4)看起来很棒!谢谢!并感谢其他所有人提供的所有其他强大替代方案!
–ma11hew28
10 Nov 23'6:12
这不是最佳解决方案,请检查以下其他解决方案。
–bunjeeb
2015年4月6日23:02
并且,如果您不确定扩展名的长度,请不要这样做:“ picture.jpeg” .slice(0,-4)->“ picture”。
–basic6
2015年4月7日在9:37
这是危险的解决方案,因为您实际上并不知道格式的长度。
–编码器
17年3月13日在18:47
“如果您知道扩展名的长度”,这是几十年来可以接受的假设。不要再使用了。
–亚历山大
20 Mar 26 '15:42
#2 楼
不确定执行速度会更快,但是当涉及到像.jpeg
或.html
这样的扩展名时,这会更可靠x.replace(/\.[^/.]+$/, "")
评论
您可能还希望禁止/作为路径分隔符,因此regexp为/\.[^/.]+$/
– gsnedders
2010-11-22 21:35
这适用于任何长度的文件扩展名(.txt或.html或.htaccess),并且还允许文件名包含其他句点(。)字符。由于扩展名本身包含句点,因此无法处理.tar.gz。文件名包含额外的句点比文件扩展名更常见。谢谢!
–史蒂夫·西格(Steve Seeger)
16年1月28日在20:56
@Vik“正确答案”和公认答案之间是有区别的。可接受的答案只是对提出该问题的人有用的答案。
–史蒂文
17年11月13日14:37
我认为Windows平台可能存在问题,因为可能会有反斜线。因此,正则表达式应为/\.[^/\\.]+$/。
– Alex Chuev
17 Dec 18 '13:32
@ElgsQianChen这是一个很好的工具,可帮助您回答问题regexr.com
– John Hartsock
19年1月15日在20:40
#3 楼
在node.js中,不带扩展名的文件名可按以下方式获取。const path = require('path');
const filename = 'hello.html';
path.parse(filename).name; //=> "hello"
path.parse(filename).ext; //=> ".html"
path.parse(filename).basename; //=> "hello.html"
在Node.js文档页面上的进一步说明。
评论
您在说什么@kaasdude...。此方法有效地删除了node上的扩展名。不确定要表达的内容,但是此方法适用于珍珠。
–埃里克
18-09-23在22:00
这个答案非常限于服务器端节点。如果您尝试在react代码中使用它,那么它似乎不会导入。
–查理
19年2月7日在19:35
如果要从包含目录的路径中删除扩展名,则可以执行var parsed = path.parse(filename),后跟path.join(parsed.dir,parsed.name)。
– Jespertheend
19年11月22日在8:41
另一种可能性是让base = path.basename(file_path,path.extname(file_path))。
–比卡森
20 Mar 12 '20 at 19:03
获取文件名的最简单方法,非常感谢。
–invinciblemuffi
20-10-22在13:13
#4 楼
x.length-4
仅占3个字符的扩展名。如果您有filename.jpeg
或filename.pl
怎么办?编辑:
要回答...当然,如果您始终具有
.jpg
的扩展名,则x.length-4
可以正常工作。但是,如果您不知道扩展名的长度,那么许多解决方案中的任何一种都是更好/更可靠的。
x = x.replace(/\..+$/, '');
或
x = x.substring(0, x.lastIndexOf('.'));
OR
x = x.replace(/(.*)\.(.*?)$/, "");
OR(假设文件名只有一个点)
parts = x.match(/[^\.]+/);
x = parts[0];
parts = x.split(".");
x = parts[0];
评论
??您可以使用一个文件名,例如:“ summer.family.jpg”,在这种情况下,split('。')[0]将仅返回部分文件名。我将从答案中删除那个,或者在该示例的问题下方清楚说明。 @basarat ...
– Roko C. Buljan
13年10月2日在22:19
关于零件分割,我经常这样做:var parts = full_file.split(“。”); var ext = parts [parts.length-1]; var file = parts.splice(0,parts.length-1).join(“。”);
–radicand
13-10-3在20:41
x.split(“。”)甚至不应被视为答案。我知道我使用“。”在我几乎所有的文件命名约定中,即“ survey.controller.js”或“ my.family.jpg”。
–李·布林德利
16年2月17日在16:52
@ Lee2808:因此仅警告一个点。这只是为了表明有多种方法,具体取决于应用程序。在几乎所有情况下,我当然都会使用其他方法之一。
–杰夫B
16年2月17日在17:57
x = x.substr(0,x.lastIndexOf('。')); -您可能是说x = x.substring(0,x.lastIndexOf('。'));?
– Dziad Borowy
17年4月21日在15:07
#5 楼
您也许可以假设最后一个点将是扩展名定界符。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);
}
评论
警告,如果没有文件扩展名,则失败。您剩下一个空字符串。
–布拉德
2013年12月1日下午4:33
较短的版本不占点。 var f = x.substr(0,x.lastIndexOf('。'))|| X;这是有效的,因为空字符串是虚假的,因此它返回x。
–乔纳森·罗尼(Jonathan Rowny)
2015年5月6日下午4:38
#6 楼
我喜欢这个,因为它是一种很难读的内衬:filename.substring(0, filename.lastIndexOf('.')) || filename
#7 楼
在0.12.x之前的Node.js版本中:path.basename(filename, path.extname(filename))
当然,这在0.12.x和更高版本中也适用。
评论
path.parse答案更简单。
– Dan Dascalescu
20 Mar 17 '20 at 14:57
#8 楼
即使在字符串中不存在定界符的情况下,此方法也有效。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 + ""
}
#9 楼
我不知道这是否是一个有效的选项,但是我使用了它: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('.')
评论
它不应该是name.join(''),而是name.join('。')。您按点分隔,但用逗号分隔,因此hello.name.txt返回hello,name
–邪恶
17年11月1日在9:20
filename.split(“。”)。shift();
– gsaandy
20-09-30在14:32
#10 楼
另一个单线:x.split(".").slice(0, -1).join(".")
#11 楼
这是另一种基于正则表达式的解决方案:filename.replace(/\.[^.$]+$/, '');
这应该仅切掉最后一段。
#12 楼
简单的一个:var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
#13 楼
可接受的答案仅剥离最后一个扩展名部分(.jpeg
),这在大多数情况下可能是一个不错的选择。我曾经不得不剥离所有扩展名(
.tar.gz
),并且文件名被限制为不包含点(因此2015-01-01.backup.tar
不会有问题):var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");
#14 楼
如果必须处理包含完整路径的变量(例如:thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"
),并且只想返回“文件名”,则可以使用: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”,与上面相同;
注意:
第一个比较慢,因为执行更多的操作
;但在两种情况下都可以使用,换句话说,它可以从包含路径或带有ex的文件名的给定字符串中提取文件名而无需扩展名。虽然第二种方法仅在给定变量包含带有ext的文件名(如filename.ext)的情况下才起作用,但速度要快一些。
这两种解决方案都适用于本地文件和服务器文件;
但是我可以不要说没有与其他答案进行性能比较,也不是为了与浏览器或操作系统兼容。
工作片段1:完整路径
var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg";
theName = thePath.split("/").slice(-1).join().split(".").shift();
alert(theName);
工作片段2:具有扩展名的文件名
var theNameWithExt = "filename.jpg";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
工作片段2:具有双扩展名的文件名
var theNameWithExt = "filename.tar.gz";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
#15 楼
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"
评论
到目前为止,这是唯一适用于完整路径的方法:path / name.ext-> paht / name而不是仅返回名称,但是我更喜欢使用fs.parse,尽管它有点冗长:stackoverflow.com / a / 59576950/895245
– Ciro Santilli郝海东冠状病六四事件法轮功
20 Jan 3'20在10:34
#16 楼
Node.js从完整路径保留目录中删除扩展名https://stackoverflow.com/a/31615711/895245例如执行
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://stackoverflow.com/ a / 36099196/895245也可以实现这一点,但是我发现这种方法在语义上更加令人愉悦。
在Node.js v10.15.2。中进行了测试。
#17 楼
尽管已经很晚了,但我将添加另一种方法来使用普通的旧JS-获取文件名而无需扩展名-path.replace(path.substr(path.lastIndexOf('.')), '')
评论
或一个部分文件扩展名的path.split('。')。pop()
– mixdev
19-09-5在17:40
他实际上是在尝试获取文件名,而不是扩展名!
–穆妮(Munim Dibosh)
19年9月12日在12:29
#18 楼
这是正则表达式派上用场的地方! Javascript的.replace()
方法将使用正则表达式,您可以利用它来完成所需的操作:// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "");
#19 楼
另一个衬板-我们假设文件是jpg图片>>例如:var yourStr ='test.jpg'; yourStr = yourStr.slice(0, -4); // 'test'
#20 楼
您可以使用path
进行操作。var MYPATH = '/User/HELLO/WORLD/FILENAME.js';
var MYEXT = '.js';
var fileName = path.basename(MYPATH, MYEXT);
var filePath = path.dirname(MYPATH) + '/' + fileName;
输出
> filePath
'/User/HELLO/WORLD/FILENAME'
> fileName
'FILENAME'
> MYPATH
'/User/HELLO/WORLD/FILENAME.js'
#21 楼
这是我用于从文件名中删除扩展名的代码,而不使用regex或indexOf(IE8中不支持indexOf)。它假定扩展名是最后一个“。”之后的任何文本。字符。适用于:
不带扩展名的文件:“ myletter”
带有'。'的文件。在名称中:“ my.letter.txt”
文件扩展名的未知长度:“ my.letter.html”
这里的代码是:
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)
17年11月27日在6:51
#AsifAli,谢谢您,我忘了阅读文件扩展名。我已经更新了答案,希望现在可以使用。
–小脑
17年11月27日在13:15
#22 楼
x.slice(0, -(x.split('.').pop().length + 1));
评论
尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以提高其长期价值。
–唐老鸭
20/12/23在10:38
#23 楼
我会使用x.substring(0,x.lastIndexOf('。'))之类的东西。如果您要提高性能,那就不要使用javascript了:-p不,对于99.99999%的所有用途,再声明一遍都不重要。评论
“如果要提高性能,请不要使用javascript”-您建议在Web应用程序中使用其他什么。
– T J
16年2月11日在16:15
他没有提到Web应用程序。
–卢卡斯·莫斯科普(Lucas Moeskops)
17年3月22日在22:01
在7年前的2010年,有人问过这个问题,并回答了这个问题,而JavaScript仅在Web应用程序中被广泛使用。 (Node刚出生,当时甚至没有指导或NPM)
– T J
17 Mar 23 '17 9:16
;-)但是,如果性能对此类任务很重要,则您可以考虑在后端执行此操作,并在前端处理结果。
–卢卡斯·莫斯科普(Lucas Moeskops)
17年3月23日在10:23
评论
请参阅:使用正则表达式删除文件扩展名,另请参见:如何使用javascript获取文件扩展名?与stackoverflow.com/questions/1991608/…几乎相同。而且,除非您做很多事情,否则担心效率就是过早的优化。
在ES6时代,还请参阅Path模块-如果您使用的是nodejs或适当的转译