Как мне удалить все символы в строке, пока не найдется подстрока в Ruby? - PullRequest
12 голосов
/ 31 марта 2011

Скажите, у меня есть строка: Hey what's up @dude, @how's it going?

Я хотел бы удалить всех символов до @how's.

Ответы [ 7 ]

18 голосов
/ 31 марта 2011

или с регулярным выражением:

str = "Hey what's up @dude, @how's it going?"
str.gsub!(/.*?(?=@how)/im, "") #=> "@how's it going?"

Вы можете прочитать об этом в здесь

14 голосов
/ 31 марта 2011

Использование Строка # ломтик

s = "Hey what's up @dude, @how's it going?"
s.slice(s.index("@how")..-1)
# => "@how's it going?"
6 голосов
/ 01 апреля 2011

Есть буквально десятки способов сделать это.Вот те, которые я бы использовал:

Если вы хотите сохранить исходную строку :

str = "Hey what's up @dude, @how's it going?"
str2 = str[/@how's.+/mi]
p str, str2
#=> "Hey what's up @dude, @how's it going?"
#=> "@how's it going?"

Если вы хотите изменить исходную строку :

str = "Hey what's up @dude, @how's it going?"
str[/\A.+?(?=@how's)/mi] = ''
p str
#=> "@how's it going?"

... или ...

str = "Hey what's up @dude, @how's it going?"
str.sub! /\A.+?(?=@how's)/mi, ''
p str
#=> "@how's it going?"

Вам необходимо \A для привязки в начале строки и флаг m дляубедитесь, что вы совпадаете по нескольким строкам.

Возможно, проще всего поменять оригинал:

str = "Hey what's up @dude, @how's it going?"
str.replace str[/@how's.+/mi]
p str
#=> "@how's it going?"
2 голосов
/ 31 марта 2011

String#slice и String#index работают нормально, но взрываются при ArgumentError: неверное значение для диапазона , если игла не находится в стоге сена.

Использование String#partition или String#rpartition может работать лучше в этом случае:

s.partition "@how's"
# => ["Hey what's up @dude, ", "@how's", " it going?"]
s.partition "not there"
# => ["Hey what's up @dude, @how's it going?", "", ""]
s.rpartition "not there"
# => ["", "", "Hey what's up @dude, @how's it going?"]
1 голос
/ 31 марта 2011

Простой способ получить только интересующую вас часть.

>> s="Hey what's up @dude, @how's it going?"
=> "Hey what's up @dude, @how's it going?"
>> s[/@how.*$/i]
=> "@how's it going?"

Если вам действительно нужно изменить строковый объект, вы всегда можете сделать s=s[...].

0 голосов
/ 31 марта 2011

Вы также можете напрямую вызвать [] также по строке (так же, как slice)

s = "Hey what's up @dude, @how's it going?"
start_index = s.downcase.index("@how")
start_index ? s[start_index..-1] : ""
0 голосов
/ 31 марта 2011
>> "Hey what's up @dude, @how's it going?".partition("@how's")[-2..-1].join
=> "@how's it going?"

без учета регистра

>> "Hey what's up @dude, @HoW's it going?".partition(/@how's/i)[-2..-1].join
=> "@HoW's it going?"

или с использованием scan()

>> "Hey what's up @dude, @HoW's it going?".scan(/@how's.*/i)[0]
=> "@HoW's it going?"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...