2016-04-22 16 views
6

Proprio desidera far corrispondere ogni personaggio fino a, ma non è compreso l'ultimo periodo diSemplice Regex: abbinare tutto fino a quando l'ultimo punto

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

ho cercato

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

Hai avuto una domanda? SO non è qui per scrivere le tue espressioni regolari per te. – jonrsharpe

+0

cosa per caso come 'abcd',' a.b.c.d.e'? – rock321987

+0

inoltre, quello che vuoi è rimuovere l'estensione del file ?? perchè non usi strumenti per questo invece di REGEX ?? come basename()? – aampudia

risposta

10

Usa lookahead per affermare l'ultimo carattere dot:

.*(?=\.) 

Live demo.

+0

non c'è bisogno di guardare avanti qui..it aumenta solo il numero di passi – rock321987

+0

questo ha funzionato benissimo grazie – bigdowg

+1

Questo corrisponderà sempre due volte nella stessa posizione. – sln

8

questo farà il trucco

(.*)\. 

Regex Demo

Il primo gruppo catturato contiene il nome. È possibile accedere come $1 o \1 secondo la vostra lingua

+0

questo includeva il punto per me – bigdowg

+1

@bigdowg dove lo stai usando? mostra solo la parte corrispondente .. la parte verde (in demo) mostra la stringa vera e propria che vuoi – rock321987

+2

Questa è una buona risposta. – sln

3

Le espressioni regolari sono avidi per impostazione predefinita. Ciò significa che quando un modello regex è in grado di far corrispondere più caratteri, corrisponderà a più caratteri.

Questa è una buona cosa, nel tuo caso. Tutto quello che devi fare è caratteri partita e poi un punto:

.*\. 

Cioè,

. # 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". 

Quindi: essere avidi di default, corrisponde ad alcun carattere volte di più che si può (perché avida) e poi un punto letterale.