как удалить из последнего символа в конце строки, до косой черты в середине строки? - PullRequest
0 голосов
/ 06 октября 2009

при условии,

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

Мне нужно начать с последнего символа до ближайшего к нему символа "/".

так что я ожидаю:

remove_last_block_of_string()

я должен получить

"/ Var / USR / местные / нуб"

если я снова запускаю remove_last_block_of_string (),

"/var/usr/local"

запустить его снова,

"/var/usr"

Ответы [ 5 ]

4 голосов
/ 06 октября 2009

Вы можете использовать это:

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

как в,

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

но если вы манипулируете путями к файлам, лучше использовать библиотеку Pathname .

2 голосов
/ 06 октября 2009

или 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"

Мы могли бы получить еще больше удовольствия:

>> 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"

Или, вы можете просто обезвредить саму String ...

>> 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"
1 голос
/ 06 октября 2009

Если вы хотите обработать общий случай, используйте регулярное выражение, как указано в других ответах.

Однако класс Ruby File обрабатывает конкретный случай, когда вы имеете дело с путями к файлам:

File.dirname("/var/usr/local/noob/")
# outputs "/var/usr/local"
0 голосов
/ 06 октября 2009

Вы можете использовать методы split и join из объектов String и 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"

Теперь вам просто нужно поместить эти две функции в объект, который содержит состояние строки, последний блок которой удаляется.

Я не знаю много о ruby, но можно реализовать что-то вроде следующего:

 // 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
      }

 }

Или как это закодировано в Ruby: P

Кстати, было бы здорово, если бы кто-то мог на самом деле реализовать этот класс, чтобы я мог узнать, как это делается;)

0 голосов
/ 06 октября 2009

Здесь: string1 = (string1.match /(.*)//)[1] if string1.include? "/"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...