我只是想知道是否有任何方法从另一个字符串删除字符串? 就像这样:

class String
  def remove(s)
    self[s.length, self.length - s.length]
  end
end

当前回答

Ruby是2。5 +。

如果你的子字符串位于字符串的开头或结尾,那么Ruby 2.5引入了这样的方法:

Delete_prefix用于从字符串的开头删除子字符串 Delete_suffix用于从字符串末尾删除子字符串

其他回答

你可以使用切片方法:

a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"

有一个非!的版本。更多信息可以在其他版本的文档中看到: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21

我会这么做

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

如果我的理解正确,这个问题似乎要求在字符串之间进行减号(-)操作,即与内置的加号(+)操作(连接)相反。

与之前的答案不同,我试图定义这样一个必须服从属性的操作:

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

如果你使用的是Rails,也可以删除。

如。"Testmessage".remove("message")输出"Test"。

警告:此方法删除所有发生的事件