从字符串中删除子字符串

dem*_*mas 183 ruby string

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

class String
  def remove(s)
    self[s.length, self.length - s.length]
  end
end
Run Code Online (Sandbox Code Playgroud)

Pet*_*ete 254

您可以使用切片方法:

a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
Run Code Online (Sandbox Code Playgroud)

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

  • 返回已删除的文本(或搜索的文本)会产生不良副作用.不幸的是链接删除的结果. (60认同)
  • @Mike`"foobar".tap {| s | s.slice!( "富")}.upcase` (14认同)
  • 如何返回切片的字符串而不影响原始字符串?例如,如果我有"hello world",我想切片"hello"并返回"world"部分,而不修改原始字符串对象? (9认同)
  • @bcackerman - `delete`不起作用,因为它会删除你传入的所有字符:`'hello world'.delete('hello')#=>'wrd'` (7认同)

Piy*_*too 154

如何str.gsub("subString", "") 查看Ruby Doc

  • `sub`比`gsub`更合适,因为OP只想从字符串的*beginning*中删除子字符串,而不是通过字符串删除子字符串(查看他的示例代码).使用像这样的正则表达式会更好:`str.sub(/ ^ subString /,'')` - 因为它确保子串只能从头开始删除. (35认同)

Wai*_*... 101

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

"hello".chomp("llo")     #=> "he"
Run Code Online (Sandbox Code Playgroud)

  • 如果它是从字符串的开头,你也可以将`chomp`与`reverse`结合使用:``hello'.reverse.chomp("he".reverse).reverse#=>"llo"` (5认同)
  • 这比切片更干净,因为它没有副作用。 (2认同)

the*_*Man 42

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

str[target] = ''
Run Code Online (Sandbox Code Playgroud)

要么

str.sub(target, '')
Run Code Online (Sandbox Code Playgroud)

如果您有多次目标使用:

str.gsub(target, '')
Run Code Online (Sandbox Code Playgroud)

例如:

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 "
Run Code Online (Sandbox Code Playgroud)

如果你需要做的就地替换使用"!"的版本gsub!sub!.

  • 红宝石很有趣!真的很喜欢看到这样的东西:`asdf['bar'] = ''` (3认同)
  • 我不会称之为“有趣” - 也许不直观。 (2认同)

edw*_*dmp 28

如果你使用的是Rails,那也是remove.

例如"Testmessage".remove("message")收益率"Test".

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


Igo*_*dov 16

如果您的子字符串位于字符串末尾的开头,那么Ruby 2.5已经为此引入了以下方法: