replace - 如何在JavaScript中修剪String中的文件扩展名?

例如,假设x.substring(0, x.indexOf('.jpg')),我想得到x.substring(0, x.length-4),其中length可以是任何文件名(假设文件名只包含[a-zA-Z0-9-_]以简化。)。

我在DZone Snippets上看过x.substring(0, x.indexOf('.jpg')),但x.substring(0, x.length-4)表现不佳? 因为,length是一个属性,不进行字符检查,而indexOf()是一个函数并进行字符检查。

ma11hew28 asked 2019-03-04T14:32:54Z
24个解决方案
358 votes

不确定什么会表现得更快,但这对于像.jpeg.html这样的扩展来说会更可靠

x.replace(/\.[^/.]+$/, "")
John Hartsock answered 2019-03-04T14:34:03Z
123 votes

在node.js中,可以如下获得没有扩展名的文件的名称。

const path = require('path');
var filename = 'hello.html';

path.parse(filename).name; // hello
path.parse(filename).ext;  // .html

Node.js文档页面的进一步说明。

Jibesh Patra answered 2019-03-04T14:34:38Z
106 votes

x = x.replace(/(.*)\.(.*?)$/, "$1");仅占3个字符的扩展名。 怎么样有x.length-4filename.pl怎么办?

编辑:

要回答...当然,如果你的扩展名总是x = x.replace(/(.*)\.(.*?)$/, "$1");,那么x.length-4就可以了。

但是,如果您不知道扩展的长度,那么任何一种解决方案都会更好/更强大。

x = x.replace(/(.*)\.(.*?)$/, "$1");

要么

x = x.replace(/(.*)\.(.*?)$/, "$1");

要么

x = x.replace(/(.*)\.(.*?)$/, "$1");

OR(假设文件名只有一个点)

parts = x.match(/[^\.]+/);
x = parts[0];

或(也只有一个点)

parts = x.split(".");
x = parts[0];
Jeff B answered 2019-03-04T14:36:02Z
101 votes

如果您知道扩展名的长度,可以使用x.slice(0, -4)(其中4是扩展名和点的三个字符)。

如果你不知道长度@John Hartsock正则表达式将是正确的方法。

如果你不想使用正则表达式,你可以试试这个(效率较低):

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

请注意,没有扩展名的文件将失败。

Marek Sapota answered 2019-03-04T14:33:30Z
34 votes

您也许可以使用最后一个点将是扩展分隔符的假设。

var x = 'filename.jpg';
var f = x.substr(0, x.lastIndexOf('.'));

如果file没有扩展名,则返回空字符串。 要修复它使用此功能

function removeExtension(filename){
    var lastDotPosition = filename.lastIndexOf(".");
    if (lastDotPosition === -1) return filename;
    else return filename.substr(0, lastDotPosition);
}
Martin Algesten answered 2019-03-04T14:36:36Z
13 votes

在0.12.x之前的Node.js版本中:

path.basename(filename, path.extname(filename))

当然这也适用于0.12.x及更高版本。

blah238 answered 2019-03-04T14:37:20Z
11 votes

即使字符串中不存在分隔符,这也可以工作。

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 + ""
}
Andrew Plank answered 2019-03-04T14:38:05Z
7 votes

另一个单线:

x.split(".").slice(0, -1).join(".")
Jacob Bundgaard answered 2019-03-04T14:38:34Z
7 votes

我喜欢这个,因为它是一个不太难读的单线:

filename.substring(0, filename.lastIndexOf('.')) || filename
Jakub answered 2019-03-04T14:39:07Z
6 votes

这是另一种基于正则表达式的解决方案:

filename.replace(/\.[^.$]+$/, '');

这应该只切断最后一段。

Chad Johnson answered 2019-03-04T14:39:42Z
6 votes

我不知道它是否是一个有效的选项,但我使用它:

name = filename.split(".");
// trimming with pop()
name.pop();
// getting the name with join()
name.join(''); // empty string since default separator is ', '

这不仅仅是我所知道的一项操作,但至少它应该始终有效!

Giacomo Cerquone answered 2019-03-04T14:40:20Z
5 votes

简单的一个:

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
Dugh answered 2019-03-04T14:40:53Z
4 votes

接受的答案仅剥离了最后一个扩展部分(.tar.gz),在大多数情况下这可能是一个不错的选择。

我曾经不得不剥离所有扩展名(.tar.gz)并且文件名被限制为不包含点(因此2015-01-01.backup.tar不会有问题):

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");
basic6 answered 2019-03-04T14:41:33Z
3 votes

如果您必须处理包含完整路径的变量(例如: ),并且您只想返回“filename”,则可以使用:

theName = thePath.split("/").slice(-1).join().split(".").shift();

结果将是theName ==“filename”;

要尝试将以下命令写入chrome调试器的控制台窗口:

如果您只需要处理文件名及其扩展名(例如: ):

theName = theNameWithExt.split(".").shift();

结果将是theName ==“filename”,与上面相同;

笔记:

  1. 第一个是慢一点因为更多的执行操作; 但在两种情况下均可使用,换句话说,它可以提取包含路径或文件名的给定字符串中没有扩展名的文件名。 虽然第二个工作只有当给定的变量包含一个像filename.ext这样的ext的文件名但是更快一点时。
  2. 这两种解决方案都适用于本地和服务器文件;

但我不能说与其他答案的性能比较,也不能说浏览器或操作系统兼容性。

工作片段1:完整路径

  
  

工作代码段2:带扩展名的文件名

  
  

工作代码段2:具有双重扩展名的文件名

  
  

willy wonka answered 2019-03-04T14:45:14Z
2 votes
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"
Yas answered 2019-03-04T14:45:49Z
2 votes

虽然现在已经很晚了,但我会添加另一种方法来获取没有扩展名的文件名使用普通的旧JS-

path.replace(path.substr(path.lastIndexOf('.')), '')

Munim Dibosh answered 2019-03-04T14:46:43Z
2 votes

使用basename和extname方法也可以使用path轻松完成此操作。

const path = require('path')

path.basename('test.txt', path.extname('test.txt'))
DBrown answered 2019-03-04T14:47:15Z
0 votes

这是正则表达式派上用场的地方! Javascript的.replace()方法将采用正则表达式,您可以利用它来实现您想要的:

// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");
Alex answered 2019-03-04T14:47:58Z
0 votes

另一个班轮 - 我们假设我们的文件是jpg图片>> 例如:var yourStr ='test.jpg';

    yourStr = yourStr.slice(0, -4); // 'test'
SorinN answered 2019-03-04T14:48:30Z
0 votes

您可以使用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'
Alan Dong answered 2019-03-04T14:49:11Z
0 votes
x.slice(0, -(x.split('.').pop().length + 1));
ishandutta2007 answered 2019-03-04T14:49:47Z
0 votes

这是我用来从文件名中删除扩展名的代码,而不使用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;
}
Little Brain answered 2019-03-04T14:51:13Z
0 votes

首先,你必须得到正确的文件扩展名,然后你可以删除它

试试这段代码

<!DOCTYPE html>
<html>
<body>
<p>Click the button to display the array values after the split.</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function getFileName(str){
    var res = str.split('.').pop();
    alert(str.replace('.' + res, ''));
}
function myFunction() {
    getFileName('abc.jpg');
    getFileName('abc.def.jpg');
    getFileName('abc.def.ghi.jpg');
    getFileName('abc.def.ghi.123.jpg');
    getFileName('abc.def.ghi.123.456.jpg');
}
</script>
</body>
</html>
VnDevil answered 2019-03-04T14:51:50Z
-1 votes

我会使用x.substring(0,x.lastIndexOf('。'))之类的东西。 如果你想要表现,不要去javascript :-p不,还有一个声明对99.99999%的目的无关紧要。

Lucas Moeskops answered 2019-03-04T14:52:23Z
translate from https://stackoverflow.com:/questions/4250364/how-to-trim-a-file-extension-from-a-string-in-javascript