2009-03-09 14 views
12

voglio ottenere solo il nome del file utilizzando espressioni regolari, così ho cercato le cose semplici comeRegex: ottieni il nome file senza estensione in un solo colpo?

([^\.]*) 

che del lavoro del corso solo se il nome del file ha un'estensione. Ma se è adfadsfads.blah.txt voglio solo adfadsfads.blah. Come posso farlo con regex?

Per quanto riguarda la domanda di David, "perché dovresti usare regex" per questo, la risposta è "per divertimento". Infatti, il codice che sto utilizzando è semplice

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

ma mi piace imparare regex quando possibile perché viene sempre a Geek cocktail party.

+0

Daniel, in tal caso, consiglierei di acquistare uno strumento come RegexBuddy. È più divertente giocare con regex se hai uno strumento del genere. È anche possibile eseguire il debug delle espressioni regolari in uno strumento del genere. Un consiglio davvero. –

+0

Grazie David. Uso il Regex Coach, che funziona davvero bene. –

risposta

33

Prova questo:

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

Questa volontà:

  • nomi di file di cattura che iniziano con un punto (ad esempio ".logs" è un file di nome ".logs", non un estensione del file), che è comune in Unix.
  • Ottiene tutto tranne l'ultimo punto: "foo.bar.jpeg" ti fa "foo.bar".
  • Gestisce file senza punti: "lettera segreta" ti fa "lettera segreta".

Nota: come commentatore j_random_hacker suggerito, questo esegue come pubblicizzato, ma si potrebbe desiderare di far precedere le cose con un punto fermo per scopi di leggibilità.

+1

C'è una buona spiegazione di questo a http://www.movingtofreedom.org/2008/04/01/regex-match-filename-base-and-extension/ – bernie

+0

La stella dovrebbe essere un vantaggio, penso - sebbene non è chiaro cosa sia un file chiamato 'log'. dovrebbe tornare. –

+1

Anche se funziona come pubblicizzato, potrei suggerire di anteporre un ancoraggio "^" solo per motivi di leggibilità? Senza l'ancora, un programmatore che vede questa espressione regolare per la prima volta deve eseguire un'analisi dettagliata per verificare che la corrispondenza restituita inizi sempre all'inizio della stringa. –

4

tutto seguito da un punto seguito da uno o più caratteri che non è un punto, seguito dalla stringa di fine:

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

Il tutto-before-the-last-dot è raggruppata per una facile recupero.

Se non si è sicuri al 100% ogni file avrà estensione, provare:

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

Non corrisponde ad un nome di file che non ha estensione –

3

come circa 2 una cattura per la fine e uno per il nome del file.

es.

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

Va bene, ma dato che dovrò buttare fuori il nome del file, perché preoccuparsi? Vorrei una regex che ottiene solo il nome del file. –

+0

Anche questo non corrisponderà a un nome di file che non contiene alcuna estensione. –

0

Ok, non sono sicuro del motivo per cui userei l'espressione regolare per questo. Se so ad esempio che la stringa è un percorso di file completo, allora userei un'altra API per ottenere il nome del file. Le espressioni regolari sono molto potenti ma al tempo stesso abbastanza complesse (lo hai appena dimostrato chiedendo come creare una regex così semplice). Qualcuno ha detto: hai avuto un problema che hai deciso di risolverlo usando espressioni regolari. Ora hai due problemi.

Ripensaci. Se si utilizza la piattaforma .NET, ad esempio, dare un'occhiata alla classe System.IO.Path.

+0

Beh, non è molto divertente, vero? Ad ogni modo, aggiustata la domanda alla tua risposta, per favore vedi sopra. Grazie. –

0
^(.*)\\(.*)(\..*)$ 
  1. Ottiene il percorso senza l'ultima \
  2. Il file senza estensione
  3. L'estensione con un .

Esempi:

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

non supporta più . nel nome del file supportati da . nel percorso del file

0

Ho usato questo modello per la ricerca semplice:

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

per questo testo:

file.ext 
    fileext 

    file.ext.ext 
file.ext 
fileext 

Trova fileext nella seconda e ultima riga.
L'ho applicato in una vista ad albero del testo di una cartella (con spazi come rientri).

Problemi correlati