2009-08-14 4 views
0

Il y a un tableau de chaînesSuppression de caractère underscore de chaque entrée dans une liste des chemins

 
    paths = ['foo/bar_baz/_sunny', bar/foo_baz/_warm', 'foo/baz/_cold', etc etc] 

Je dois enlever underscore dans chaque dernière partie du chemin (_sunny => ensoleillé, _warm => chaud, _cold => froid)

 
    paths.each do |path| 
     path_parts = path.split('/') 
     path_parts.last.sub!(/^_/, '') 
     puts path_parts.join('/') 
    end 

Cependant cette solution est un peu sale. Je pense que cela peut être fait sans utiliser path.split et path.join. As tu des idées?

Merci à l'avance

+1

S'il vous plaît modifier le titre pour cette question à quelque chose comme "Suppression du caractère de soulignement de chaque entrée dans une liste de chemins" car ce n'est pas lié à Refactoring dans le sens "modifier la structure interne du code sans changer son comportement externe". – mikej

+0

ok titre est changé comme vous avez proposé – mlomnicki

Répondre

2

Je ne sais pas Ruby, mais le modèle

/('[a-zA-Z0-9_\/]*\/)_([a-zA-Z0-9_]*')/g 

pourrait être remplacé par

'$1$2' 

si $x est utilisé en Ruby pour des groupes de référence correspondant, et g est un indicateur valide. Il aurait besoin d'être appliqué une fois à la chaîne, sans séparations ni jointures.

+0

merci! cela résout le problème – mlomnicki

+1

alors acceptez la réponse de Daniel – mikej

2

Ou, de manière plus compacte:

paths.map {|p| p.sub(/_(?=[^\/]*$)/,"")} 

C'est, la bande toute underscore qui est suivi par un certain nombre de non-slash, puis la fin de la chaîne ...

+0

très agréable! mais que signifie '? =' dans regexp? – mlomnicki

+0

"'? = '" Est un aperçu non concordant. Dans cet exemple, il ne correspondra à "_" que si les caractères suivants sont tels qu'indiqués, mais les caractères suivants ne feront pas partie de la correspondance. De cette façon, où "_" est remplacé, vous n'avez pas besoin de répéter les caractères qui apparaissent après. Ma propre solution pourrait utiliser '? <' Et '? =' Pour éviter d'avoir à utiliser des groupes. Cela peut entraîner des gains de performance significatifs. –

+0

Merci beaucoup pour votre explication, Daniel! – mlomnicki

Questions connexes