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
/(.*)\.[^.]+$/
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.
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.
/^(.+)(\.[^ .]+)?$/
Cas de test où cela fonctionne et d'autres échouent:
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:
La manière de les gérer est problématique et se décide mieux en fonction du projet.
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(/\.[^.]*$/,'')
)
/^(.+)(\.[^ .]+)?$/
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
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()
return filename.split('.').pop();
il réalisera votre souhait. Mais pas d'expression régulière.
Cela le fera aussi :)
'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');
Je m'en tiendrais au regexp si ... = P