web-dev-qa-db-ja.com

ファイルの拡張子を削除するための正規表現

ファイル名の拡張子を削除し、ファイルの名前のみを返すことができる正規表現が必要です。

入力と出力の例を次に示します。

myfile.png     -> myfile
myfile.png.jpg -> myfile.png

私は明らかにこれを手動で行うことができます(つまり、最後のドットからすべてを削除します)が、これを単独で行うことができる正規表現があると確信しています。

記録のために、私はJavaScriptでこれを行っています

33
Andreas Grech
/(.*)\.[^.]+$/

結果はその最初のキャプチャグループになります。ただし、正規表現を使用せずに、右端のピリオドの位置を見つけて、その前にあるすべてのものを取得する方がおそらく効率的です。

40
Amber

完全を期すために:正規表現なしでこれをどのように達成できますか?

_var input = 'myfile.png';
var output = input.substr(0, input.lastIndexOf('.')) || input;
_

_|| input_はケースを処理します。lastIndexOf()は_-1_を提供します。ほら、それはまだワンライナーです。

83
Boldewyn
/^(.+)(\.[^ .]+)?$/

これが機能し、他が失敗するテストケース:

  • 「.htaccess」(先行期間)
  • 「ファイル」(ファイル拡張子なし)
  • 「ミセスに送って」 (拡張子はありませんが、略語で終わります。)
  • 「プロジェクトのバージョン1.2」(拡張子なし、まだピリオドが含まれています)

上記の一般的なスレッドは、もちろん「不正な」ファイル拡張子です。しかし、あなたは常にこれらのコーナーケースについて考える必要があります。 :P

これが失敗するテストケース:

  • 「バージョン1.2」(ファイル拡張子はありませんが、「表示」されているようです)
  • 「name.tar.gz」(これを「複合拡張子」と見なし、「name」と「.tar.gz」に分割する場合)

これらの処理方法は問題が多く、プロジェクト固有の基準で最も適切に決定されます。

11
Roger Pate

パターンに一致する正規表現は次のとおりです。

/\.[^.]*$/

ピリオド文字(\。)の後に、ピリオドではない0個以上の文字([^。] *)が続き、その後に文字列の末尾( $)。

console.log( 
  "aaa.bbb.ccc".replace(/\.[^.]*$/,'')
)
6
Igor Oks
/^(.+)(\.[^ .]+)?$/

上記のパターンは間違っています-常に拡張子も含まれます。これは、javascript正規表現エンジンがどのように機能するかによるものです。 (\.[^ .]+)トークンはオプションであるため、エンジンは(.+)http://cl.ly/image/3G1I3h3M2Q0M と文字列全体を正常に一致させます。


これがテスト済みの正規表現ソリューションです。

パターンは、スラッシュ区切り記号とバックスラッシュ区切り記号の両方を考慮して、パスの拡張子の有無にかかわらずfilenameNoExtと一致します

var path = "c:\some.path/subfolder/file.ext"
var m = path.match(/([^:\\/]*?)(?:\.([^ :\\/.]*))?$/)
var fileName = (m === null)? "" : m[0]
var fileExt  = (m === null)? "" : m[1]

上記のパターンの分析:

([^:\\/]*?)  // match any character, except slashes and colon, 0-or-more times,
             // make the token non-greedy so that the regex engine
             // will try to match the next token (the file extension)
             // capture the file name token to subpattern \1

(?:\.        // match the '.' but don't capture it
([^ :\\/.]*) // match file extension
             // ensure that the last element of the path is matched by prohibiting slashes
             // capture the file extension token to subpattern \2
)?$          // the whole file extension is optional

http://cl.ly/image/3t3N413g3K09

http://www.gethifi.com/tools/regex

これは、@ RogerPateによって言及されたすべてのケースをカバーしますが、フルパスも含まれます。

4

正規表現なしの別の方法(@Rahulのバージョンの「反対」、pop()を使用せずに削除)

変数を2回参照する必要がないため、インライン化が簡単です

filename.split('.').slice(0,-1).join()
3
Daniel
  return filename.split('.').pop();

それはあなたの願いを叶えます。しかし、正規表現ではありません。

0
Rahul

これも同様に行います:)

'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');

私は正規表現に固執します... = P

0
Marcus Westin