我只是想知道是否有任何方法从另一个字符串删除字符串? 就像这样:
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
当前回答
我会这么做
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
其他回答
如果你只有一个目标字符串的出现,你可以使用:
str[target] = ''
or
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!和子!
如果我的理解正确,这个问题似乎要求在字符串之间进行减号(-)操作,即与内置的加号(+)操作(连接)相反。
与之前的答案不同,我试图定义这样一个必须服从属性的操作:
如果c = a + b那么c - a = b AND c - b = a
我们只需要三个内置的Ruby方法来实现这一点:
’abracadabra’partition(’abra’)。values_at(0.2)。加入== cadabras。
我不会解释它是如何工作的,因为一次运行一个方法很容易理解。
下面是概念验证代码:
# 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),最后一个建议是:使用Refinements,而不是像前面的例子中那样对String进行猴子修补。
简单如下:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
并使用MinusString在你需要它的块之前添加。
如果它是字符串的结尾,你也可以使用chomp:
"hello".chomp("llo") #=> "he"
我会这么做
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
如果你使用的是Rails,也可以删除。
如。"Testmessage".remove("message")输出"Test"。
警告:此方法删除所有发生的事件