2009-03-09 9 views
12

Ich möchte nur den Dateinamen mit Regex erhalten, also habe ich versucht, einfache Dinge wieRegex: Get Dateiname ohne Erweiterung in One Shot?

([^\.]*) 

die natürlich Arbeit nur dann, wenn der Dateiname eine Erweiterung hat. Aber wenn es adfadsfads.blah.txt ist, ich will nur adfadsfads.blah. Wie kann ich das mit Regex machen?

In Bezug auf Davids Frage, ‚warum sollte man regex verwenden‘ für diese, ist die Antwort, ‚zum Spaß.‘ In der Tat ist der Code, den ich mit einfachen

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

aber Ich mag regex lernen, wann immer möglich, weil es immer bei Geek Cocktail-Partys kommt.

+0

Daniel, in so einem Fall würde ich Ihnen empfehlen, ein Tool wie RegexBuddy zu kaufen. Es macht mehr Spaß mit Regex zu spielen, wenn Sie ein solches Werkzeug haben. Sie können sogar reguläre Ausdrücke in einem solchen Tool debuggen. Ein wirklich empfehlen, dass. –

+0

Danke David. Ich benutze Regex Coach, was wirklich gut funktioniert. –

Antwort

33

Try this:

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

Dies wird:

  • Capture-Dateinamen, die mit einem Punkt (zB ".logs" Start ist eine Datei ".logs" genannt, nicht ein Dateierweiterung), die unter Unix üblich ist.
  • Ruft alles außer dem letzten Punkt: "foo.bar.jpeg" bekommt Sie "foo.bar".
  • Griffe Dateien ohne Punkt: „Geheimbrief“ bringt „Geheimbrief“.

Hinweis: als Kommentator j_random_hacker vorgeschlagen, dies führt wie angekündigt, aber Sie könnten Dinge mit einem Anker aus Gründen der Lesbarkeit vorangestellt werden sollen.

+1

Es gibt eine gute Erklärung dieses einen http://www.movingtofreedom.org/2008/04/01/regex-match-filename-base-and-extension/ – bernie

+0

Der Stern sollte ein Plus sein, denke ich - obwohl Es ist nicht klar, was eine Datei namens "log." sollte zurückkehren. –

+1

Obwohl dies wie angekündigt funktioniert, könnte ich vorschlagen, einen "^" - Anker nur aus Gründen der Lesbarkeit voranzustellen? Ohne den Anker muss ein Programmierer, der diese Regex zum ersten Mal sieht, eine detaillierte Analyse durchführen, um sicherzustellen, dass die zurückgegebene Übereinstimmung immer am Anfang der Zeichenfolge beginnt. –

4

gefolgt Alles durch einen Punkt gefolgt von einem oder mehreren Zeichen, die nicht mit einem Punkt ist, gefolgt von dem End-of-string:

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

Das alles-vor-der-letzten-Punkt für die einfache gruppiert Abruf.

Wenn Sie jede Datei nicht zu 100% sicher sind, dass eine Verlängerung hat, versuchen Sie:

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

Es passt nicht zu einem Dateinamen, der keine Erweiterung hat –

3

wie etwa 2 fängt eine für das Ende und ein für die Dateinamen.

z.

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

Das ist alles in Ordnung, aber da ich den Dateinamen rauswerfen werde, warum stören? Ich möchte eine Regex, die nur den Dateinamen erhält. –

+0

Diese Datei stimmt auch nicht mit einem Dateinamen überein, der keine Erweiterung enthält. –

0

Ok, ich bin nicht sicher, warum ich regulären Ausdruck dafür verwenden würde. Wenn ich beispielsweise weiß, dass die Zeichenfolge ein vollständiger Dateipfad ist, würde ich eine andere API verwenden, um den Dateinamen zu erhalten. Reguläre Ausdrücke sind sehr mächtig, aber zugleich sehr komplex (Sie haben bewiesen, dass nur mit der Frage, wie eine solche einfache Regex erstellen). Jemand sagte: Sie hatten ein Problem, dass Sie sich entschieden haben, es mit regulären Ausdrücken zu lösen. Jetzt hast du zwei Probleme.

Denken Sie noch einmal. Wenn Sie zum Beispiel auf einer .NET-Plattform sind, werfen Sie einen Blick auf die Klasse System.IO.Path.

+0

Nun, das macht nicht viel Spaß, oder? Wie auch immer, die Frage zu Ihrer Antwort angepasst, siehe oben. Vielen Dank. –

0
^(.*)\\(.*)(\..*)$ 
  1. Ruft den Pfad ohne den letzten \
  2. die Datei ohne Erweiterung
  3. Die die Erweiterung mit einem .

Beispiele:

c:\1\2\3\Books.accdb
(c:\1\2\3)(Books)(.accdb)

nicht mehrere . in Dateinamen unterstützt das Does Unterstützung . in Dateipfad

0

ich dieses Muster für eine einfache Suche verwendet:

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

für diesen Text:

file.ext 
    fileext 

    file.ext.ext 
file.ext 
fileext 

Es findet fileext in der zweiten und letzten Zeile.
Ich habe es in einer Textbaumansicht eines Ordners (mit Leerzeichen als Einzüge) angewendet.