Как удалить все символы в строке до тех пор, пока подстрока не будет сопоставлена ​​в Ruby?

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

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

Ответ 1

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

str = "Hey what up @dude, @how it going?"
str.gsub!(/.*?([email protected])/im, "") #=> "@how it going?"

вы можете прочитать о поиске на здесь

Ответ 2

Используйте String # slice

s = "Hey what up @dude, @how it going?"
s.slice(s.index("@how")..-1)
# => "@how it going?"

Ответ 3

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

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

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

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

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

... или...

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

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

Может быть, проще всего для мутирования оригинала:

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

Ответ 4

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

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

s.partition "@how's"
# => ["Hey what up @dude, ", "@how's", " it going?"]
s.partition "not there"
# => ["Hey what up @dude, @how it going?", "", ""]
s.rpartition "not there"
# => ["", "", "Hey what up @dude, @how it going?"]

Ответ 5

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

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

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

Ответ 6

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

Нечувствительность к регистру

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

Или используя scan()

>> "Hey what up @dude, @HoW it going?".scan(/@how's.*/i)[0]
=> "@HoW it going?"

Ответ 7

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

s = "Hey what up @dude, @how it going?"
start_index = s.downcase.index("@how")
start_index ? s[start_index..-1] : ""