web-dev-qa-db-fra.com

Expression régulière pour supprimer l'extension d'un fichier

J'ai besoin d'une expression régulière qui peut supprimer l'extension d'un nom de fichier, renvoyant uniquement le nom du fichier.

Voici quelques exemples d'entrées et de sorties:

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

Je peux évidemment le faire manuellement (c'est-à-dire tout supprimer du dernier point) mais je suis sûr qu'il existe une expression régulière qui peut le faire par elle-même.

Pour mémoire, je le fais en JavaScript

33
Andreas Grech
/(.*)\.[^.]+$/

Le résultat sera dans ce premier groupe de capture. Cependant, il est probablement plus efficace de simplement trouver la position de la période la plus à droite et de tout prendre avant, sans utiliser l'expression régulière.

40
Amber

Juste pour être complet: comment cela pourrait-il être réalisé sans expressions régulières?

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

Le || input S'occupe du cas où lastIndexOf() fournit un -1. Vous voyez, c'est toujours une ligne.

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

Cas de test où cela fonctionne et d'autres échouent:

  • ".htaccess" (première période)
  • "fichier" (pas d'extension de fichier)
  • "envoyer à mme." (pas d'extension, mais se termine en abr.)
  • "version 1.2 du projet" (pas d'extension, mais contient toujours un point)

Le fil conducteur ci-dessus est, bien sûr, les extensions de fichier "malformées". Mais vous devez toujours penser à ces cas d'angle. : P

Cas de test en cas d'échec:

  • "version 1.2" (pas d'extension de fichier, mais "semble" en avoir une)
  • "name.tar.gz" (si vous le voyez comme une "extension composée" et que vous le vouliez divisé en "name" et ".tar.gz")

La manière de les gérer est problématique et se décide mieux en fonction du projet.

11
Roger Pate

L'expression régulière correspondant au modèle est:

/\.[^.]*$/

Il trouve un caractère point (\.), suivi de 0 ou plusieurs caractères qui ne sont pas des points ([^.] *), suivi de la fin de la chaîne ( $).

console.log( 
  "aaa.bbb.ccc".replace(/\.[^.]*$/,'')
)
6
Igor Oks
/^(.+)(\.[^ .]+)?$/

Le modèle ci-dessus est incorrect - il inclura toujours également l'extension. C'est à cause du fonctionnement du moteur regex javascript. Le (\.[^ .]+) le jeton est facultatif afin que le moteur corresponde avec succès à la chaîne entière avec (.+)http://cl.ly/image/3G1I3h3M2Q0M


Voici ma solution regexp testée.

Le modèle correspondra à filenameNoExt avec/sans extension dans le chemin, en respectant les séparateurs de barre oblique et de barre oblique inverse

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

dissection du motif ci-dessus:

([^:\\/]*?)  // 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

Cela couvrira tous les cas mentionnés par @RogerPate mais aussi les chemins complets

4
Steven Pribilinskiy

une autre façon sans regex de le faire ("l'opposé" de la version de @ Rahul, sans utiliser pop () pour le supprimer)

Il ne nécessite pas de faire référence à la variable deux fois, il est donc plus facile de l'intégrer

filename.split('.').slice(0,-1).join()
3
Daniel
  return filename.split('.').pop();

il réalisera votre souhait. Mais pas d'expression régulière.

0
Rahul

Cela le fera aussi :)

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

Je m'en tiendrais au regexp si ... = P

0
Marcus Westin