2016-04-22 34 views
6

wollen einfach jedes Zeichen, um bis zu, aber nicht die letzte Periode einschließlichEinfache Regex: Match alles bis zum letzten Punkt

dog.jpg  -> dog 
abc123.jpg.jpg -> abc123.jpg 

I

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

Haben Sie eine Frage? SO ist nicht hier, um deine regulären Ausdrücke für dich zu schreiben. – jonrsharpe

+0

was für Fall wie 'abcd',' a.b.c.d.e'? – rock321987

+0

auch, was Sie wollen, ist die Dateierweiterung zu entfernen ?? Warum benutzt du keine Werkzeuge dafür statt REGEX ?? wie Basisname()? – aampudia

Antwort

10

Verwenden Look-Ahead das letzte Punktzeichen zu behaupten:

.*(?=\.) 

Live demo.

+0

gibt es keine Notwendigkeit von Lookahead hier..es erhöht nur die Anzahl der Schritte – rock321987

+0

das hat super funktioniert danke – bigdowg

+1

Dies wird immer zweimal am selben Ort übereinstimmen. – sln

8

Dies wird der Trick

versucht haben
(.*)\. 

Regex Demo

Die erste erfasste Gruppe enthält den Namen. Sie können darauf zugreifen, wie $1 oder \1 wie pro Ihre Sprache

+0

das beinhaltet den Punkt für mich – bigdowg

+1

@bigdowg wo verwenden Sie es? es zeigt nur den übereinstimmenden Teil .. der grüne Teil (in der Demo) zeigt die tatsächliche Zeichenfolge, die Sie wollen – rock321987

+2

Dies ist eine gute Antwort. – sln

3

Reguläre Ausdrücke gierig standardmäßig sind. Das bedeutet, dass ein Regex-Muster, wenn es in der Lage ist, mehr Zeichen zu finden, mehr Zeichen enthält.

Dies ist eine gute Sache, in Ihrem Fall. Alles, was Sie tun müssen, ist Zeichen übereinstimmen und dann ein Punkt:

.*\. 

heißt,

ist
. # Match "any" character 
* # Do the previous thing (.) zero OR MORE times (any number of times) 
\ # Escape the next character - treat it as a plain old character 
. # Escaped, just means "a dot". 

Also:, AS jedes Zeichen OFT standardmäßig gierig wie möglich (weil gierig) und dann ein wörtlicher Punkt.