回答:
あなたはスライス法を使うことができます:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
非「!」があります バージョンも。他のバージョンに関するドキュメントでも詳細情報を確認できます:http : //www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
delete
それはあなたが合格すべての文字を削除するので、動作しません:'hello world'.delete('hello') #=> ' wrd'
Ruby Docをstr.gsub("subString", "")
調べてみてはいかがですか
sub
gsub
OPは文字列全体ではなく、文字列の先頭から部分文字列を削除するだけなので、より適切です(彼のサンプルコードを見てください)。そして、このような正規表現を使用することはより良いでしょう:str.sub(/^subString/, '')
-それは部分文字列が確実に最初からのみ削除されることを保証するためです。
subString
ますが、正規表現の特殊文字が含まれていないことが確実でない場合は危険です。
/^subString/
はリテラルであるため、メタ文字が含まれていないことを確認できます。他の文字列を正規表現に置き換える場合は、次のようにできます/#{Regexp.escape(str)}/
。
Regexp.escape()
。
文字列の終わりの場合は、次のように使用することもできますchomp
。
"hello".chomp("llo") #=> "he"
chomp
との組み合わせでreverse
:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
ターゲット文字列が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!
。
asdf['bar'] = ''
slice
メソッドはスライスされた文字列の一部を返さず、「ナイフ」を返します
slice!
def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
部分文字列が文字列の最初と最後にある場合、Ruby 2.5はこのためのメソッドを導入しています。
レールを使用している場合やアクティブサポートが少ない場合は、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
私が正しく解釈している場合、この質問は文字列間のマイナス(-)演算、つまり組み込みのプラス(+)演算(連結)の反対のようなものを要求するようです。
以前の回答とは異なり、私はプロパティに従う必要があるような操作を定義しようとしています:
IF c = a + b THEN 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)を使用している場合の最後のアドバイスは、前の例のようにサルパッチング文字列の代わりに絞り込みを使用します。
それは次のように簡単です:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
using MinusString
必要な場所にブロックの前に追加します。
これが私がやることです
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
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
Ö
たとえば、OPは削除を要求しませんでした。
[]
非bangバージョンにはsを使用することもできます。