web-dev-qa-db-ja.com

文字列から部分文字列を削除する

他の文字列から文字列を削除する方法があるかどうか私は思っていませんか。このようなもの:

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

スライスメソッドを使うことができます:

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

非 '!'がありますバージョンも。より多くの情報は他のバージョンに関するドキュメンテーションでも見ることができます: http://www.Ruby-doc.org/core/classes/String.html#M00121

246
Pete

str.gsub("subString", "")はどうですか Ruby Doc を調べてください

150
Piyush Mattoo

それが文字列の終わりであれば、 chomp を使うこともできます。

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

ターゲット文字列が1回しかない場合は、次のものを使用できます。

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!を使用してください。

42
the Tin Man

Railsを使っているのであれば remove もあります。

例えば。 "Testmessage".remove("message")"Test"を返します。

警告:このメソッドはall出現を削除します

23
edwardmp

あなたの部分文字列が文字列の終わりの始めにある場合、Ruby 2.5はこのためのメソッドを導入しました:

  • delete_prefix 文字列の先頭から部分文字列を削除します
  • delete_suffix 文字列の末尾から部分文字列を削除します
12
Igor Drozdov

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

2
Dinatih

私が正しく解釈しているなら、この質問は文字列の間のマイナス( - )操作、すなわち組み込みのプラス(+)操作(連結)の反対のようなものを要求するようです。

前の答えとは異なり、私はプロパティに従わなければならないような操作を定義しようとしています:

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

これを実現するために必要な組み込みRubyメソッドは3つだけです。

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

一度に1つのメソッドを実行することで簡単に理解できるため、その仕組みについては説明しません。

これが概念コードの証明です。

# 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)を使用している場合の最後のアドバイスです。サルの代わりに 改良版 を使用してください。前の例のように-patching文字列。

それは同じくらい簡単です:

module MinusString
  refine String do
    def -(str)
      partition(str).values_at(0,2).join
    end
  end
end

そして、必要なブロックの前にusing MinusStringを追加します。

1