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

我在DZone片段上看到了x.substring(0, x.indexOf('.jpg')),但是x.substring(0, x.length-4)的效果会更好吗?因为,length是一个属性并且不进行字符检查,而indexOf()是一个函数并且进行字符检查。

评论

请参阅:使用正则表达式删除文件扩展名,另请参见:如何使用javascript获取文件扩展名?

与stackoverflow.com/questions/1991608/…几乎相同。而且,除非您做很多事情,否则担心效率就是过早的优化。

在ES6时代,还请参阅Path模块-如果您使用的是nodejs或适当的转译

#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.jpegfilename.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