ファイル名の拡張子を削除し、ファイルの名前のみを返すことができる正規表現が必要です。
入力と出力の例を次に示します。
myfile.png -> myfile
myfile.png.jpg -> myfile.png
私は明らかにこれを手動で行うことができます(つまり、最後のドットからすべてを削除します)が、これを単独で行うことができる正規表現があると確信しています。
記録のために、私はJavaScriptでこれを行っています
/(.*)\.[^.]+$/
結果はその最初のキャプチャグループになります。ただし、正規表現を使用せずに、右端のピリオドの位置を見つけて、その前にあるすべてのものを取得する方がおそらく効率的です。
完全を期すために:正規表現なしでこれをどのように達成できますか?
_var input = 'myfile.png';
var output = input.substr(0, input.lastIndexOf('.')) || input;
_
_|| input
_はケースを処理します。lastIndexOf()
は_-1
_を提供します。ほら、それはまだワンライナーです。
/^(.+)(\.[^ .]+)?$/
これが機能し、他が失敗するテストケース:
上記の一般的なスレッドは、もちろん「不正な」ファイル拡張子です。しかし、あなたは常にこれらのコーナーケースについて考える必要があります。 :P
これが失敗するテストケース:
これらの処理方法は問題が多く、プロジェクト固有の基準で最も適切に決定されます。
パターンに一致する正規表現は次のとおりです。
/\.[^.]*$/
ピリオド文字(\。)の後に、ピリオドではない0個以上の文字([^。] *)が続き、その後に文字列の末尾( $)。
console.log(
"aaa.bbb.ccc".replace(/\.[^.]*$/,'')
)
/^(.+)(\.[^ .]+)?$/
上記のパターンは間違っています-常に拡張子も含まれます。これは、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によって言及されたすべてのケースをカバーしますが、フルパスも含まれます。
正規表現なしの別の方法(@Rahulのバージョンの「反対」、pop()を使用せずに削除)
変数を2回参照する必要がないため、インライン化が簡単です
filename.split('.').slice(0,-1).join()
return filename.split('.').pop();
それはあなたの願いを叶えます。しかし、正規表現ではありません。
これも同様に行います:)
'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');
私は正規表現に固執します... = P