2009-03-09 5 views
12

私は正規表現を使用してファイル名だけを取得したいので、私は、ファイル名が1つの拡張子を持っている場合にのみ、コースワークの正規表現:拡張子なしのファイル名をワンショットで入手できますか?

([^\.]*) 

のような簡単な事をしようとしてきました。しかし、もしそれがadfadsfads.blah.txtなら私はちょうどadfadsfads.blahがほしいと思う。正規表現でどうすればいいですか?

ダビデの質問に関しては、なぜ「正規表現」を使用するのですか?答えは「楽しい」です。実際には、私が使用しているコードは、単純な

length_of_ext = File.extname(filename).length 
filename = filename[0,(filename.length-length_of_ext)] 

ですが、それは常にオタクカクテルパーティーで立ち上がるので、私は可能な限り正規表現を学びたいです。終わりの文字列が続いドットではありません1文字以上続くドット続い

+0

Danielのようなケースでは、RegexBuddyのようなツールを購入することをお勧めします。あなたがそのようなツールを持っているなら、regexを使って遊ぶほうが楽しいです。このようなツールで正規表現をデバッグすることさえできます。本当にそれをお勧めします。 –

+0

Davidに感謝します。 Regex Coachを使っていますが、これは本当にうまくいきます。 –

答えて

33

これを試してみてください:

(.+?)(\.[^.]*$|$) 

これは以下となります。

    ドットで始まる
  • キャプチャファイル名(例えば ".logsは" ".logs" という名前のファイル、ではありませんファイル拡張子)。これはUnixでは一般的です。
  • 最後のドット以外のすべてを取得します。「foo.bar.jpeg」は「foo.bar」を取得します。
  • ドットのないファイルを処理します。「secret-letter」はあなたに「秘密の文字」を与えます。

注:コメンターのj_random_hackerが示唆されているように、これは宣伝通り実行していますが、読みやすさの目的のためにアンカーで物事を先行する場合があります。

+1

http://www.movi​​ngtofreedom.org/2008/04/01/regex-match-filename-base-and-extension/ – bernie

+0

スターはプラスでなければならないと思いますファイルが「ログ」と呼ばれるものが明確ではありません。戻る必要があります。 –

+1

これは宣伝されているように機能しますが、可読性のためだけに "^"アンカーを付けることを提案できますか?アンカーがなければ、最初にこの正規表現を見るプログラマーは詳細な分析を行い、返された一致が常に文字列の先頭から始まることを確認する必要があります。 –

4

すべて、:

(.+?)\.[^\.]+$ 

すべてビフォア - 最後のドットを簡単にするためにグループ化されています検索。

あなたはすべてのファイルの拡張子を持つことになり、100%わからない場合は、試してみてください。

(.+?)(\.[^\.]+$|$) 
+0

拡張子がないファイル名と一致しません –

3

約2が終了し、ファイル名のいずれかの1をキャプチャする方法。

例えば、

(.+?)(?:\.[^\.]*$|$) 
+0

それでも問題ありませんが、ファイル名を投げ捨てるので、どうして気になるのですか?私はファイル名を取得する正規表現が欲しいです。 –

+0

このファイルも拡張子を含まないファイル名と一致しません。 –

0

これで正規表現を使用する理由はわかりません。たとえば文字列が完全なファイルパスであることがわかっている場合は、別のAPIを使用してファイル名を取得します。正規表現は非常に強力ですが、同時に非常に複雑です(このような単純な正規表現の作成方法を尋ねることで、あなたはそれを証明しています)。誰かが言った:正規表現を使って解決することに決めたという問題がありました。今あなたには2つの問題があります。

もう一度考えてください。たとえば、.NETプラットフォームを使用している場合は、System.IO.Pathクラスを参照してください。拡張子なし

+0

これはあまり楽しいものではありませんか?とにかく、あなたの答えに質問を調整しました、上記を参照してください。ありがとう。 –

0
^(.*)\\(.*)(\..*)$ 
  1. 最後\
  2. ファイルなしでパスを取得します
  3. .

例と拡張子:

c:\1\2\3\Books.accdb
このテキストに

^\s*[^\.\W]+$ 

は、ファイル名に複数の.をサポートしていません 私は単純な検索のために、このパターンを使用し

0

ファイルパスでサポート.行いませ

file.ext 
    fileext 

    file.ext.ext 
file.ext 
fileext 

2行目と最後の行にはfileextがあります。
私はそれをフォルダのテキストツリービュー(インデントとしてスペースを含む)で適用しました。

関連する問題