2009-10-05 8 views
0

en supposant,comment supprimer du dernier caractère à la fin d'une chaîne, à une barre oblique au milieu d'une chaîne?

string1 = "/var/usr/local/noob/" 

je dois commencer à partir du dernier caractère le plus proche «/» preceiding il.

donc je me attends:

remove_last_block_of_string() 

je devrais obtenir

"/ var/usr/local/Noob"

si je cours remove_last_block_of_string() à nouveau,

"/var/usr/local" 

exécuter à nouveau,

"/var/usr" 
+0

Pas beaucoup de différence entre "/ var/usr/local/Noob /" et «/var/usr/local/noob " –

+0

Vous serez plus heureux si vous utilisez la facilité de votre langage pour manipuler les chemins comme des chemins, plutôt que comme des chaînes. @Peter suggère une bibliothèque appelée Pathname, qui me va bien (je ne suis pas un programmeur ruby) – rmeador

Répondre

4

Vous pouvez utiliser ceci:

sub(/\/[^\/]*$/, '') 

comme dans

>> "/var/usr/local/noob".sub(/\/[^\/]*$/, '') 
=> "/var/usr/local" 
>> _.sub(/\/[^\/]*$/, '') 
=> "/var/usr" 

mais si vous manipulez des chemins de fichiers, il serait préférable d'utiliser la Pathname bibliothèque.

0

Ici: string1 = (string1.match /(.*)//)[1] si string1.include? "/"

2

Ou, string1 = string1[0...string1.rindex('/')]


>> def a s; s[0...s.rindex('/')]; end 
>> t = "/var/usr/local/noob/" 
=> "/var/usr/local/noob/" 
>> t = a t 
=> "/var/usr/local/noob" 
>> t = a t 
=> "/var/usr/local" 

Nous pourrions avoir encore plus de plaisir:

>> class MyPath < String 
>> def root; self[0...self.rindex('/')]; end 
>> end 
=> nil 
>> t = MyPath.new("/var/usr/local/noob/") 
=> "/var/usr/local/noob/" 
>> t = t.root 
=> "/var/usr/local/noob" 
>> t = t.root 
=> "/var/usr/local" 
>> t = t.root 
=> "/var/usr" 

Ou, vous pouvez simplement lui-même ... monkey-patch Chaîne

>> class String 
>> def root; self[0...self.rindex('/')]; end 
>> end 
=> nil 
>> t = "/var/usr/local/noob/" 
=> "/var/usr/local/noob/" 
>> t = t.root 
=> "/var/usr/local/noob" 
>> t = t.root 
=> "/var/usr/local" 
0

Vous pouvez utiliser split et join rencontré auges de cordes et objets Array:

>> s = "/var/usr/local/noob/" 
=> "/var/usr/local/noob/" 
>> p = s.split('/') 
=> ["", "var", "usr", "local", "noob"] 
>> p.slice!(-1) 
=> "noob" 
>> p.join('/') 
=> "/var/usr/local" 
>> p.slice!(-1) 
=> "local" 
>> p.join('/') 
=> "/var/usr" 
>> p.slice!(-1) 
=> "usr" 
>> p.join('/') 
=> "/var" 

Maintenant, il vous suffit de mettre ces deux fonctions dans un objet qui maintient l'état de la chaîne dont le dernier bloc est supprimé.

Je ne sais pas beaucoup de rubis, mais quelque chose comme ce qui suit pourrait être appliquée:

// Pseusdo - Java 
class LastBlockRemoved { 
     private String string; 
     private Array currentState; 

     public String remove_last_block_of_string() { 
      currentState = string.split("/"); 
      string = currentState.join("/"); 
      return string 
     } 

} 

Ou cependant qui est codé en Ruby: P

BTW Ce serait bien si quelqu'un pouvait réellement mettre en œuvre cette classe, afin que je puisse apprendre comment il est fait;)

1

Si vous voulez gérer le cas général, puis utiliser une expression régulière tel que fourni par d'autres réponses.

Cependant, la classe gère Ruby File le cas particulier où vous faites affaire avec des chemins de fichiers:

File.dirname("/var/usr/local/noob/") 
# outputs "/var/usr/local" 
Questions connexes