JavaScriptで文字列からファイル拡張子をトリミングする方法は?


295

たとえば、以下のことを仮定してx = filename.jpg、私が取得したいfilename場合は、filename任意のファイル名にすることができ(のファイル名のみが[-ZA-Z0-9は-_]簡単にするために含まれているとしましょう。)。

DZone Snippetsで見x.substring(0, x.indexOf('.jpg'))ましたが、パフォーマンスは良くありませんか?ので、プロパティであり、一方、文字のチェックを行わない機能であり、文字のチェックを行います。x.substring(0, x.length-4)lengthindexOf()



stackoverflow.com/questions/1991608/…とほぼ同じです。そして、これらの多くを一度に行わない限り、効率を心配するのは時期尚早の最適化です。
典型的なポール

ES6の年齢では、も参照パスあなたはnodejsまたは適切transpilation使用している場合-モジュールを
フランクNocke

回答:


173

拡張子の長さがわかっている場合x.slice(0, -4)は、使用できます(4は拡張子とドットの3文字です)。

長さがわからない場合は、@ John Hartsockの正規表現が適切な方法です。

正規表現を使用したくない場合は、これを試すことができます(パフォーマンスが低下します)。

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

拡張子のないファイルでは失敗することに注意してください。


私はこのソリューションが一番好きです。それはクリーンで、ファイル拡張子が常にであることを知っているので、それを使用できます.jpg。私は、Rubyのようなものを探していたx[0..-5]、そしてx.slice(0, -4)素晴らしいですね!ありがとう!そして、提供されている他のすべての強力な代替手段を他の皆に感謝します!
ma11hew28 2010年

22
これは最適なソリューションではありません。以下の他のソリューションを確認してください。
bunjeeb 2015

8
また、拡張機能の長さが100%わからない場合は、これを行わないでください"picture.jpeg".slice(0, -4)。-> "画像"。
basic6

13
これは危険な解決策です。形式の長さがわからないためです。
コーダー2017年

「拡張の長さを知っている場合」これは許容できる仮定であったので、数十年になります。これはもう使わないでください。
アレクサンダー-モニカを

453

何がより高速に実行されるかはわかりませんが、.jpegまたはのような拡張機能に関しては、これはより信頼できるでしょう。.html

x.replace(/\.[^/.]+$/, "")

15
/もパス区切り文字として許可しないので、正規表現は/\.[^/.]+$/です
gsnedders

これは、任意の長さのファイル拡張子(.txtまたは.htmlまたは.htaccess)で機能し、ファイル名に追加のピリオド(。)文字を含めることもできます。拡張子自体にピリオドが含まれているため、たとえば.tar.gzは処理されません。ファイル名には、ファイル拡張子よりもピリオドを追加する方が一般的です。ありがとう!
Steve Seeger

2
@Vik「正しい答え」と受け入れられた答えには違いがあります。受け入れられた回答は、質問をした人にとって役立つ回答にすぎません。
Steven

4
バックスラッシュがある可能性があるため、Windowsプラットフォームに問題がある可能性があります。したがって、正規表現は/\.[^/\\.]+$/になります。
Alex Chuev 2017

1
ここ@ElgsQianChenヘルプの答えにあなたのための素晴らしいツールです、あなたの質問regexr.com
ジョンHartsock

281

Node.js次のように、拡張子を除いたファイルの名前を得ることができます。

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

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

Node.jsの ドキュメントページでさらに説明します。


2
@kaasdude ....について話している内容このメソッドは、ノードの拡張を効果的に削除します。何を表現したいのかはわかりませんが、このメソッドは真珠のように機能します。
エリック

1
この回答はサーバー側ノードにかなり制限されています。これを反応コードで使用しようとすると、インポートされないようです。
チャーリー

1
ディレクトリを含むパスから拡張子を削除したい場合は、のvar parsed = path.parse(filename)後に続けpath.join(parsed.dir, parsed.name)ます。
Jespertheend

別の可能性はlet base = path.basename( file_path, path.extname( file_path ) )
ビカールセン

116

x.length-43文字の拡張子のみを考慮します。あなたが持っている場合はどうなりますfilename.jpegfilename.pl

編集:

答えると...確かに、常にの拡張子がある場合は.jpg、問題x.length-4なく動作します。

ただし、拡張の長さがわからない場合は、いくつかの解決策のいずれかが優れています/より堅牢です。

x = x.replace(/\..+$/, '');

または

x = x.substring(0, x.lastIndexOf('.'));

または

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

または(ファイル名にドットが1つしかないという前提で)

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

または(ドットも1つだけ)

parts = x.split(".");
x = parts[0];

12
?? ファイル名はex: "summer.family.jpg"にすることができますその場合、split( '。')[0]は部分的なファイル名のみを返します。私はそれを回答から削除するか、その例の問題の下に明確に述べます。@basarat ...
ロコC.ブルジャン2013年

パーツ分割に関して私が頻繁に行うこと:var parts = full_file.split("."); var ext = parts[parts.length-1]; var file = parts.splice(0,parts.length-1).join(".");
radicand

x.split( "。")は解答と見なされるべきではありません。私は「。」を使用することを知っています 私のファイル命名規則のほとんどすべて、つまり「survey.controller.js」または「my.family.jpg」。
Lee Brindley、2016

@ Lee2808:したがって、1つのドットのみの警告。これは単に、アプリケーションに応じて、いくつかのアプローチがあることを示すためのものです。私はほぼすべてのケースで他の方法の1つを確かに使用します。
ジェフB

x = x.substr(0, x.lastIndexOf('.'));-あなたはおそらく意味したのx = x.substring(0, x.lastIndexOf('.'));ですか?
Dziad Borowy 2017

39

最後のドットが拡張子区切り文字であるという仮定を使用できます。

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);
}

警告、ファイル名拡張子がない場合は失敗します。空の文字列が残ります。
ブラッド、

18
ドットを含まない短いバージョン。var f = x.substr(0, x.lastIndexOf('.')) || x;空の文字列は扱いにくいため、これは機能し、したがってxを返します。
Jonathan Rowny、

22

読みにくくないワンライナーなので、私はこれが好きです。

filename.substring(0, filename.lastIndexOf('.')) || filename


12

これは、区切り文字が文字列に存在しない場合でも機能します。

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 + ""
}

10

有効なオプションかどうかはわかりませんが、これを使用します。

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.

これは私が知っている1つの操作だけではありませんが、少なくとも常に機能するはずです。

更新:ワンライナーが必要な場合、ここにあります:

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


1
name.join( '')ではなく、name.join( '。')にする必要があります。あなたは、ドットによって分割が、コンマで参加し、そのhello.name.txtリターンhello, name
悪の


7

次に、別の正規表現ベースのソリューションを示します。

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

これは最後のセグメントのみを切り落とすべきです。


7

単純なもの:

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;

6

受け入れられた回答では、最後の拡張部分のみ.jpegが削除されます()。これは、ほとんどの場合に適切な選択です。

以前はすべての拡張子(.tar.gz)を削除する必要があり、ファイル名にはドットが含まれないように制限されていました(そのため2015-01-01.backup.tar、問題はありません)。

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");


3

完全なパス(例:)を含む変数を処理する必要があり、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"になります。

ノート:

  1. 1つ目は少し遅いため、より多くの操作を実行します。しかし、どちらの場合でも機能します。つまり、パスまたはexを含むファイル名を含む特定の文字列から拡張子なしのファイル名を抽出できます。2番目の方法は、指定された変数にfilename.extのようなextを持つファイル名が含まれている場合にのみ機能しますが、少し高速です。
  2. どちらのソリューションも、ローカルファイルとサーバーファイルの両方で機能します。

しかし、他の回答とのパフォーマンスの比較についても、ブラウザーまたはOSの互換性についても、何も言えません。

作業スニペット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);
  


3

かなり遅いですが、プレーンな古いJS-を使用して拡張子なしでファイル名を取得する別のアプローチを追加します

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


またはpath.split('.').pop()一部のファイル拡張子の場合
mixdev

彼は実際には拡張子ではなくファイル名を取得しようとしていました!
Munim Dibosh

3

Node.jsは、フルパスを保持するディレクトリから拡張子を削除します

たとえば、https://stackoverflow.com/a/31615711/895245path/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.1でテスト済み。


0

ここで正規表現が役に立ちます。Javascriptの.replace()メソッドは正規表現を使用します。これを利用して、目的を達成できます。

// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");

0

もう1つのライナー-ファイルはjpg画像であると想定します>>例:var yourStr = 'test.jpg';

    yourStr = yourStr.slice(0, -4); // 'test'

0

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'


0

これは、正規表現やindexOfを使用せずにファイル名から拡張子を削除するために使用するコードです(indexOfはIE8ではサポートされていません)。拡張子は最後の「。」の後のテキストであると想定しています。キャラクター。

それはのために働きます:

  • 拡張子のないファイル:「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

#AsifAliありがとうございます。ファイル拡張子を読み取るのを忘れました。私は答えを更新しました、私はそれが今うまくいくことを願っています。
Little Brain

-3

私はx.substring(0、x.lastIndexOf( '。'))のようなものを使用します。パフォーマンスを重視する場合は、javascriptを使用しないでください。


2
「パフォーマンスを重視する場合は、JavaScriptを使用しないでください」-Webアプリケーションで他に何を使用することを提案していますか?
TJ

彼はウェブアプリケーションについては触れていません。
Lucas Moeskops 2017年

1
この質問が出され、回答が7年前の2010年に投稿されました。JavaScriptは、ほとんどWebアプリケーションでのみ使用されていました。(ノードは生まれたばかりで、当時ガイドやNPMさえありませんでした)
TJ

;-)それでも、このようなタスクでパフォーマンスが重要な場合は、バックエンドでこれを実行し、フロントエンドで結果を処理することを検討できます。
Lucas Moeskops 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.