Domanda

Ho bisogno di un'espressione regolare in grado di rimuovere l'estensione di un nome file, restituendo solo il nome del file.

Ecco alcuni esempi di ingressi e uscite:

myfile.png     -> myfile
myfile.png.jpg -> myfile.png

Ovviamente posso farlo manualmente (cioè rimuovere tutto dall'ultimo punto) ma sono sicuro che esiste un'espressione regolare che può farlo da sola.

Solo per la cronaca, lo sto facendo in JavaScript

È stato utile?

Soluzione

/(.*)\.[^.]+$/

Il risultato sarà in quel primo gruppo di acquisizione. Tuttavia, è probabilmente più efficiente trovare la posizione del periodo più giusto e poi prendere tutto prima di esso, senza usare regex.

Altri suggerimenti

Solo per completezza: come è possibile ottenere questo risultato senza le espressioni regolari?

var input = 'myfile.png';
var output = input.substr(0, input.lastIndexOf('.')) || input;

Il || input si occupa del caso in cui lastIndexOf () fornisce un -1 . Vedi, è ancora una linea.

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

Casi di prova in cui questo funziona e altri falliscono:

  • " .htaccess " (periodo iniziale)
  • " file di " (nessuna estensione file)
  • " invia a mrs. " (nessuna estensione, ma termina in abbr.)
  • "versione 1.2 del progetto" (nessuna estensione, ma contiene ancora un punto)

Il thread comune sopra è, ovviamente, "malformato" estensioni di file. Ma devi sempre pensare a quei casi angolari. : P

Casi di prova in cui ciò fallisce:

  • "versione 1.2" (nessuna estensione di file, ma "appare" per averne uno)
  • " name.tar.gz " (se lo vedi come "estensione composta" e desideri che venga suddiviso in "nome" e "quot ..gar")

Il modo in cui gestirli è problematico e deciso al meglio su base specifica del progetto.

L'espressione regolare corrispondente al modello è:

/\.[^.]*$/

Trova un carattere punto ( \. ), seguito da 0 o più caratteri che non sono punti ( [^.] * ), seguito dalla fine di la stringa ( $ ).

console.log( 
  "aaa.bbb.ccc".replace(/\.[^.]*$/,'')
)

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

Il modello sopra è sbagliato - includerà sempre anche l'estensione. È a causa di come funziona il motore regex javascript. Il token (\. [^.] +) è facoltativo, quindi il motore abbinerà correttamente l'intera stringa con (. +) http://cl.ly/image/3G1I3h3M2Q0M


Ecco la mia soluzione regexp testata.

Il modello abbinerà il nome del file NoExt con / senza estensione nel percorso, rispettando i separatori barra e barra rovesciata

var path = "c:\some.path/subfolder/file.ext"
var m = path.match(/([^:\\/]*?)(?:\.([^ :\\/.]*))?$/)
var fileName = (m === null)? "" : m[0]
var fileExt  = (m === null)? "" : m[1]

dissezione del modello sopra:

([^:\\/]*?)  // match any character, except slashes and colon, 0-or-more times,
             // make the token non-greedy so that the regex engine
             // will try to match the next token (the file extension)
             // capture the file name token to subpattern \1

(?:\.        // match the '.' but don't capture it
([^ :\\/.]*) // match file extension
             // ensure that the last element of the path is matched by prohibiting slashes
             // capture the file extension token to subpattern \2
)?$          // the whole file extension is optional

http://cl.ly/image/3t3N413g3K09

http://www.gethifi.com/tools/regex

Questo coprirà tutti i casi menzionati da @RogerPate ma includendo anche i percorsi completi

un altro modo non regex di farlo (il "opposto" della versione di @ Rahul, che non usa pop () per rimuovere)

Non è necessario fare riferimento alla variabile due volte, quindi è più semplice incorporare

filename.split('.').slice(0,-1).join()

Anche questo lo farà :)

'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');

Vorrei attenermi alla regexp sebbene ... = P

  return filename.split('.').pop();

renderà realtà il tuo desiderio. Ma non in modo espressione regolare.

In javascript puoi chiamare il metodo Replace () che sostituirà in base a un'espressione regolare.

Questa espressione regolare corrisponderà a tutto dall'inizio alla fine della riga e rimuoverà qualsiasi cosa dopo l'ultimo periodo compreso il periodo.

/^(.*)\..*$/

Il modo di implementare la sostituzione può essere trovato in questa domanda StackOverflow.

Domanda regex Javascript

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top