Мне просто интересно, есть ли способ удалить строку из другой строки? Что-то вроде этого:
class String
def remove(s)
self[s.length, self.length - s.length]
end
end
Мне просто интересно, есть ли способ удалить строку из другой строки? Что-то вроде этого:
class String
def remove(s)
self[s.length, self.length - s.length]
end
end
Вы можете использовать метод среза:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
существует не '!' версия также. Более подробную информацию можно найти в документации по другим версиям: http://www.ruby-doc.org/core/classes/String.html#M001213
Как насчет str.gsub("subString", "")
Посмотрите Ruby Doc
Если это конец строки, вы также можете использовать chomp
:
"hello".chomp("llo") #=> "he"
Если у вас есть только одно вхождение целевой строки, которую вы можете использовать:
str[target] = ''
или
str.sub(target, '')
Если у вас есть несколько случаев использования цели:
str.gsub(target, '')
Например:
asdf = 'foo bar'
asdf['bar'] = ''
asdf #=> "foo "
asdf = 'foo bar'
asdf.sub('bar', '') #=> "foo "
asdf = asdf + asdf #=> "foo barfoo bar"
asdf.gsub('bar', '') #=> "foo foo "
Если вам нужно сделать замену на месте, используйте версии "!"
gsub!
и sub!
.
Если вы используете Rails, также remove
.
например. "Testmessage".remove("message")
дает "Test"
.
Предупреждение: этот метод удаляет все вхождения
Если вы используете рельсы или менее активны, вы получаете String # remove и String # remove! метод
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
источник: http://api.rubyonrails.org/classes/String.html#method-i-remove
Если я правильно интерпретирую, этот вопрос, похоже, запрашивает что-то вроде операции минус (-) между строками, т.е. противоположно встроенной операции плюс (+) (конкатенация).
В отличие от предыдущих ответов, я пытаюсь определить такую операцию, которая должна подчиняться свойству:
IF c = a + b THEN c - a = b AND c - b = a
Для этого нам нужны только три встроенных метода Ruby:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'
.
Я не буду объяснять, как это работает, потому что его можно легко понять, используя один метод за раз.
Вот пример кода концепции:
# minus_string.rb
class String
def -(str)
partition(str).values_at(0,2).join
end
end
# Add the following code and issue 'ruby minus_string.rb' in the console to test
require 'minitest/autorun'
class MinusString_Test < MiniTest::Test
A,B,C='abra','cadabra','abracadabra'
def test_C_eq_A_plus_B
assert C == A + B
end
def test_C_minus_A_eq_B
assert C - A == B
end
def test_C_minus_B_eq_A
assert C - B == A
end
end
Последнее слово совета, если вы используете недавнюю версию Ruby ( >= 2.0): используйте Уточнения вместо патчей обезьяны String, как в предыдущем примере.
Это так же просто, как:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
и добавьте using MinusString
перед блоками, в которых вы нуждаетесь.
вот что я буду делать
2.2.1 :015 > class String; def remove!(start_index, end_index) (end_index - start_index + 1).times{ self.slice! start_index }; self end; end;
2.2.1 :016 > "idliketodeleteHEREallthewaytoHEREplease".remove! 14, 32
=> "idliketodeleteplease"
2.2.1 :017 > ":)".remove! 1,1
=> ":"
2.2.1 :018 > "ohnoe!".remove! 2,4
=> "oh!"
Отформатировано на нескольких строках:
class String
def remove!(start_index, end_index)
(end_index - start_index + 1).times{ self.slice! start_index }
self
end
end
def replaceslug
slug = "" + name
@replacements = [
[ "," , ""],
[ "\\?" , ""],
[ " " , "-"],
[ "'" , "-"],
[ "Ç" , "c"],
[ "Ş" , "s"],
[ "İ" , "i"],
[ "I" , "i"],
[ "Ü" , "u"],
[ "Ö" , "o"],
[ "Ğ" , "g"],
[ "ç" , "c"],
[ "ş" , "s"],
[ "ı" , "i"],
[ "ü" , "u"],
[ "ö" , "o"],
[ "ğ" , "g"],
]
@replacements.each do |pair|
slug.gsub!(pair[0], pair[1])
end
self.slug = slug.downcase
end