423

たとえば、x = filename.jpgを取得したいfilename場合、filename任意のファイル名を取得できます(簡略化するために、ファイル名に[a-zA-Z0-9-_]のみが含まれていると仮定します)。

DZone Snippetsで見x.substring(0, x.indexOf('.jpg'))ましたが、パフォーマンスは向上しませんか?なぜなら、はプロパティであり、文字チェックを行わないのに対し、は関数であり、文字チェックを行うからです。x.substring(0, x.length-4)lengthindexOf()

4

24 に答える 24

567

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

x.replace(/\.[^/.]+$/, "")
于 2010-11-22T21:29:34.790 に答える
479

node.jsでは、拡張子のないファイル名は次のように取得できます。

const path = require('path');
const filename = 'hello.html';
    
path.parse(filename).name;     //=> "hello"
path.parse(filename).ext;      //=> ".html"
path.parse(filename).base; //=> "hello.html"

Node.js ドキュメントページでの詳細な説明。

于 2015-07-24T16:43:02.623 に答える
269

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

長さがわからない場合は、@JohnHartsock正規表現が適切なアプローチになります。

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

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

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

于 2010-11-22T21:29:55.527 に答える
129

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];
于 2010-11-22T21:28:54.733 に答える
48

おそらく、最後のドットが拡張子区切り文字になるという仮定を使用できます。

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);
}
于 2010-11-22T21:30:11.550 に答える
38

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

filename.substring(0, filename.lastIndexOf('.')) || filename
于 2017-12-23T23:09:49.047 に答える
22

0.12.xより前のNode.jsバージョンの場合:

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

もちろん、これは0.12.x以降でも機能します。

于 2015-12-16T00:01:15.943 に答える
14

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

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('.')

于 2015-11-29T20:44:21.933 に答える
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 + ""
}
于 2014-09-17T12:15:48.457 に答える
9

別のワンライナー:

x.split(".").slice(0, -1).join(".")
于 2014-01-08T12:10:31.447 に答える
7

別の正規表現ベースのソリューションは次のとおりです。

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

これは、最後のセグメントのみを切り落とす必要があります。

于 2015-01-29T22:25:52.350 に答える
7

単純なもの:

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
于 2016-06-21T07:59:11.723 に答える
6

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

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

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");
于 2015-02-14T20:06:22.960 に答える
6
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"
于 2016-03-19T07:40:59.670 に答える
5

完全なパス(例:)を含む変数を処理する必要があり、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. 最初のものは少し遅いので、より多くの操作を実行します。ただし、どちらの場合も機能します。つまり、パスまたは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:拡張子が2つあるファイル名

var theNameWithExt = "filename.tar.gz";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
  

于 2016-10-12T15:04:57.473 に答える
5

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.jsv10.15.2でテスト済み。

于 2020-01-03T10:29:21.497 に答える
4

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

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

于 2018-04-05T16:50:08.320 に答える
0

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

// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");
于 2010-11-22T21:32:53.273 に答える
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;
}
于 2015-11-11T11:45:18.050 に答える
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'
于 2016-04-30T00:28:02.580 に答える
0

私はそれを行うために正規表現を使用するのが好きです。短くてわかりやすいです。

for (const regexPattern of [
  /\..+$/,  // Find the first dot and all the content after it.
  /\.[^/.]+$/ // Get the last dot and all the content after it.
  ]) {
  console.log("myFont.ttf".replace(regexPattern, ""))
  console.log("myFont.ttf.log".replace(regexPattern, ""))
}

/* output
myFont
myFont
myFont
myFont.ttf
*/

上記の説明はそれほど厳密ではないかもしれません。より正確な説明が必要な場合は、regex101にアクセスして確認してください。

于 2021-06-17T07:24:38.333 に答える
-1

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

    yourStr = yourStr.slice(0, -4); // 'test'
于 2014-08-16T02:47:15.883 に答える
-1
x.slice(0, -(x.split('.').pop().length + 1));
于 2017-11-25T13:08:50.247 に答える
-3

x.substring(0、x.lastIndexOf('。'))のようなものを使用します。パフォーマンスを重視する場合は、JavaScriptをまったく使用しないでください:-pいいえ、すべての目的の99.99999%で、もう1つのステートメントは実際には重要ではありません。

于 2010-11-22T21:29:57.060 に答える