例えばx = filename.jpg
と仮定すると、filename
を取得したいと思います。ここでfilename
は任意のファイル名にすることができます(簡単にするためにファイル名には[a-zA-Z0-9-_]しか含まれていません)。
私はx.substring(0, x.indexOf('.jpg'))
を DZone Snippets で見ましたが、x.substring(0, x.length-4)
のほうがパフォーマンスが良くないでしょうか?なぜなら、length
はプロパティであり、文字チェックをしないのに対して、indexOf()
は関数であり文字チェックをするからです。
拡張子の長さがわかっている場合は、x.slice(0, -4)
を使用できます(4は拡張子とドットの3文字です)。
@John Hartsockの正規表現の長さがわからない場合は、正しい方法です。
正規表現を使用したくない場合は、これを試すことができます(パフォーマンスが低下します)。
filename.split('.').slice(0, -1).join('.')
拡張子のないファイルでは失敗することに注意してください。
何がより速く実行されるかわからないが、これは.jpeg
や.html
のような拡張子に関してはより信頼できるでしょう。
x.replace(/\.[^/.]+$/, "")
node.jsでは、拡張子を除いたファイル名は次のようにして取得できます。
const path = require('path');
var filename = 'hello.html';
path.parse(filename).name; // hello
path.parse(filename).ext; // .html
Node.jsドキュメント ページでさらなる説明。
x.length-4
は3文字の拡張子のみを占めます。 filename.jpeg
またはfilename.pl
がある場合はどうなりますか?
編集:
答えるために...確かに、あなたがいつも.jpg
の拡張子を持っていれば、x.length-4
はうまく動くでしょう。
しかしながら、あなたがあなたの拡張の長さを知らないならば、多くの解決策のどれもがより良い/より堅牢です。
x = x.replace(/\..+$/, '');
OR
x = x.substring(0, x.lastIndexOf('.'));
OR
x = x.replace(/(.*)\.(.*?)$/, "$1");
OR(ファイル名はドットが1つしかないと仮定して)
parts = x.match(/[^\.]+/);
x = parts[0];
OR(1ドットのみ)
parts = x.split(".");
x = parts[0];
最後のドットが拡張子の区切り文字になるという仮定を使用することができます。
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);
}
0.12.xより前のNode.jsバージョンでは、次のようになります。
path.basename(filename, path.extname(filename))
もちろん、これは0.12.x以降でも機能します。
これは、区切り文字が文字列に存在しない場合でも機能します。
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 + ""
}
それが読むのが難しくない1ライナーであるので、私はこれが好きです:
filename.substring(0, filename.lastIndexOf('.')) || filename
有効なオプションかどうかはわかりませんが、これを使用します。
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つの操作だけではありませんが、少なくともそれは常にうまくいくはずです!
更新:あなたがonelinerが欲しいなら、ここにあなたは:
(name.split('.').slice(0, -1)).join('.')
もう一つのワンライナー:
x.split(".").slice(0, -1).join(".")
これは別の正規表現ベースの解決策です:
filename.replace(/\.[^.$]+$/, '');
これは最後のセグメントを切り落とすだけです。
これは、basenameおよびextnameメソッドを使用してpathを使用しても簡単に実行できます。
const path = require('path')
path.basename('test.txt', path.extname('test.txt'))
受け入れられた答えは最後の拡張部分(.jpeg
)だけを取り除きます、それはほとんどの場合良い選択かもしれません。
私はかつてすべての拡張子(.tar.gz
)を削除しなければならず、ファイル名はドットを含まないように制限されていました(2015-01-01.backup.tar
は問題にならないでしょう)。
var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");
簡単なもの
var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
完全なパス(例:thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"
)を含む変数を処理する必要があり、単に "filename"を返したい場合は、次のようにします。
theName = thePath.split("/").slice(-1).join().split(".").shift();
結果はtheName == "filename"になります。
試してみるには、クロムデバッガのコンソールウィンドウに次のコマンドを書いてください。window.location.pathname.split("/").slice(-1).join().split(".").shift()
ファイル名とその拡張子だけを処理する必要がある場合(例:theNameWithExt = "filename.jpg"
)
theName = theNameWithExt.split(".").shift();
結果はtheName == "filename"となり、上記と同じです。
しかし、私は他の答えとのパフォーマンスの比較もブラウザや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);
かなり遅れていますが、私は拡張子のないファイル名を取得するために別のアプローチを追加します。
path.replace(path.substr(path.lastIndexOf('.')), '')
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"
これが正規表現が便利になるところです! Javascriptの.replace()
メソッドは正規表現を取ります、そしてあなたはそれを利用してあなたが望むものを達成することができます:
// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");
x.slice(0, -(x.split('.').pop().length + 1));
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'
もう1つの裏付け - ファイルはjpgの写真であると思います>> ex:var yourStr = 'test.jpg';
yourStr = yourStr.slice(0, -4); // 'test'
これは、正規表現もindexOfも使わずに、ファイル名から拡張子を削除するために使うコードです(indexOfはIE 8ではサポートされていません)。拡張子は最後の '。'以降のテキストであると仮定します。キャラクター。
それは働きます:
これがコードです:
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;
}