从字符串中删除子字符串

时间:2011-03-20 06:49:27

标签: ruby string

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

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

10 个答案:

答案 0 :(得分:245)

您可以使用切片方法:

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

有一个非'!'版本也是。有关其他版本的文档中也可以看到更多信息: http://www.ruby-doc.org/core/classes/String.html#M001213

答案 1 :(得分:149)

str.gsub("subString", "")怎么样 查看Ruby Doc

答案 2 :(得分:92)

如果它是字符串的结尾,您也可以使用chomp

"hello".chomp("llo")     #=> "he"

答案 3 :(得分:42)

如果您只有一次出现的目标字符串,则可以使用:

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!的{​​{1}}版本。

答案 4 :(得分:23)

如果您使用的是Rails,还有remove

E.g。 "Testmessage".remove("message")会产生"Test"

警告:此方法会删除所有出现次数

答案 5 :(得分:11)

如果您的子字符串位于字符串末尾的开头,则Ruby 2.5引入了以下方法:

答案 6 :(得分:2)

如果您使用的是rails或者不太活跃的支持,则可以使用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

答案 7 :(得分:1)

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

与之前的答案不同,我正在尝试定义必须遵守该属性的此类操作:

IF c = a + b THEN c - a = b AND c - b = a

我们只需要三个内置的Ruby方法来实现这个目标:

$(".sheath-toggle-icon").click(function() { var icon = $(this).find("i"); if (icon.hasClass("glyphicon-menu-hamburger") ) { icon.switchClass("glyphicon-menu-hamburger", "glyphicon-menu-left"); } else if ( icon.hasClass("glyphicon-menu-left") ) { icon.switchClass("glyphicon-menu-left", "glyphicon-menu-hamburger"); } })

我不会解释它是如何工作的,因为可以很容易地理解一次运行一种方法。

以下是概念证明代码:

'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'

如果您使用的是最近的Ruby版本(> = 2.0),请使用最后一条忠告:使用Refinements代替猴子修补字符串,如上例所示。

这很简单:

# 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

并在您需要的块之前添加module MinusString refine String do def -(str) partition(str).values_at(0,2).join end end end

答案 8 :(得分:-2)

这就是我要做的事情

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

答案 9 :(得分:-6)

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