2009-11-25 3 views
0

Comment puis-je tout attraper après le dernier trait de soulignement dans un nom de fichier?Comment puis-je tout attraper après le trait de soulignement dans un chemin de fichier avec JavaScript?

ex: 24235235adasd_4.jpg dans 4.jpg

Merci encore!

+0

sans utiliser une regex:?) – Don

+1

@Don, il y a deux réponses avec regexp et deux sans. Que pourrais-tu vouloir de plus? ;) –

+0

Devrait être "après le trait de soulignement" dans le titre de la question? – Matchu

Répondre

11
var end = "24235235adasd_4.jpg".match(/.*_(.*)/)[1]; 

Édition: Oups, le modificateur ungreedy était faux.

Édition 2: Après avoir exécuté un test de performance, c'est la méthode la plus lente. Ne l'utilisez pas;) Voici le benchmark et les résultats.

Benchmark:

var MAX  = 100000,  i = 0, 
    s  = new Date(), e = new Date(), 
    str  = "24235235ad_as___4.jpg", 
    methods = { 
     "Matching": function() { return str.match(/.*_(.*)/)[1];    }, 
     "Substr": function() { return str.substr(str.lastIndexOf('_') + 1); }, 
     "Split/pop": function() { return str.split('_').pop();     }, 
     "Replace": function() { return str.replace(/.*_/,'');     } 
    }; 

console.info("Each method over %d iterations", MAX); 
for (var m in methods) { 
    if (!methods.hasOwnProperty(m)) { continue; } 
    i = 0; 

    s = new Date(); 
    do { 
     methods[m](); 
    } while (++i<MAX); 
    e = new Date(); 

    console.info(m); 
    console.log("Result: '%s'", methods[m]()); 
    console.log("Total: %dms; average: %dms", +e - +s, (+e - +s)/MAX); 
} 

Résultats:

Each method over 100000 iterations 
Matching 
Result: '4.jpg' 
Total: 1079ms; average: 0.01079ms 
Substr 
Result: '4.jpg' 
Total: 371ms; average: 0.00371ms 
Split/pop 
Result: '4.jpg' 
Total: 640ms; average: 0.0064ms 
Replace 
Result: '4.jpg' 
Total: 596ms; average: 0.00596ms 

Gordon Tucker's Substr/lastIndexOf est le plus rapide par un long shot.

+5

+1 pour autocritique et référence –

+0

Merci Tim! (15charfiller) –

+0

Différentes implémentations JavaScript/ECMAScript effectueront ce test différemment. Par curiosité quel moteur a été utilisé pour les résultats ici? Il serait vraiment intéressant de voir s'il y avait des variations dans les résultats sur les autres moteurs. Merci d'avoir pris le temps de le faire! – mckamey

9
"24235235adasd_4.jpg".split('_').pop(); 
+1

+1 Comme cela retourne tout le dernier trait de soulignement – Matt

+1

+1 pour le code le plus lisible, et pour permettre l'entrée avec * non * traits de soulignement –

+0

Lisible oui, mais toutes les autres réponses en dehors de mon propre travail avec ou sans traits de soulignement . –

13
var foo = '24235235adasd_4.jpg'; 
var bar = foo.substr(foo.lastIndexOf('_') + 1); 

* Notez que pour vous cela ne marchera pas avec ces fichiers hors du commun qui ont un « _ » dans leur extension (par exemple, je l'ai vu certains qui sont nommés filename.tx_)

+0

+ 1 cela semble être le moyen le plus rapide de faire cette tâche. – user

+0

Vous en avez un de trop en fermant ')'. –

+2

+1 Ceci est la méthode la plus rapide. Voir ma réponse pour le benchmark. –

0
var end = filename.replace(/.*_/,''); 
Questions connexes