Dizeyi başka bir dizeden kaldırmak için herhangi bir yöntem olup olmadığını merak ediyorum. Bunun gibi bir şey:
class String
def remove(s)
self[s.length, self.length - s.length]
end
end
Yanıtlar:
Dilim yöntemini kullanabilirsiniz:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
yok '!' versiyonu da. Diğer sürümlerle ilgili belgelerde de daha fazla bilgi bulunabilir: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
deletetüm karakterleri sildiği için işe yaramaz:'hello world'.delete('hello') #=> ' wrd'
Nereden str.gsub("subString", "")
kontrol edin Yakut Doc
subgsubOP, alt dizeyi dizenin tamamından değil, dizenin başından kaldırmak istediğinden daha uygun olacaktır (örnek koduna bakın). Ve bunun gibi bir normal ifade kullanmak daha iyi olur: str.sub(/^subString/, '')- çünkü alt dizenin kesinlikle yalnızca baştan kaldırılmasını sağlar.
subStringherhangi bir normal ifade özel karakterleri içermediğinden emin olamazsak tehlikelidir .
/^subString/nedenle herhangi bir meta karakter içermediğinden çok emin olabiliriz. Eğer bir regex içine diğer bazı dize yerine iseniz, bunu yapabilirsiniz: /#{Regexp.escape(str)}/.
Regexp.escape().
Dizenin sonuysa, şunları da kullanabilirsiniz chomp:
"hello".chomp("llo") #=> "he"
chompreverse"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Hedef dizenin yalnızca bir örneğine sahipseniz, kullanabilirsiniz:
str[target] = ''
veya
str.sub(target, '')
Birden çok kez hedef kullanımınız varsa:
str.gsub(target, '')
Örneğin:
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 "
Tek yapmanız gereken ise yerinde değiştirmelerin kullanmak "!"sürümlerini gsub!ve sub!.
asdf['bar'] = ''
Rails kullanıyorsanız bir de var remove.
Örneğin "Testmessage".remove("message")verim "Test".
Uyarı: bu yöntem tüm olayları kaldırır
sliceyöntem dizginin dilimlenmiş kısmını döndürmez, "bıçak" ı döndürür
slice! def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
Alt dizeniz bir dizenin sonunda başındaysa, Ruby 2.5 bunun için yöntemleri tanıtmıştır:
Ray kullanıyorsanız veya daha az aktif destek kullanıyorsanız, String # kaldırılır ve String # kaldırılır! yöntem
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
kaynak: http://api.rubyonrails.org/classes/String.html#method-i-remove
Doğru yorumluyorsam, bu soru dizeler arasında eksi (-) işlemi gibi bir şey istiyor gibi görünüyor, yani yerleşik artı (+) işleminin (birleştirme) tersi.
Önceki cevaplardan farklı olarak, özelliğe uyması gereken böyle bir işlem tanımlamaya çalışıyorum:
EĞER c = a + b SONRA c - a = b VE c - b = a
Bunu başarmak için yalnızca üç yerleşik Ruby yöntemine ihtiyacımız var:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'.
Nasıl çalıştığını açıklamayacağım çünkü her seferinde bir yöntemi çalıştırmanın kolayca anlaşılabilmesi.
İşte konsept kodunun bir kanıtı:
# 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
Yeni bir Ruby sürümü kullanıyorsanız (> = 2.0) son bir tavsiye: önceki örnekte olduğu gibi maymun yamalı String yerine Ayrıntılandırmaları kullanın.
Bu kadar kolay:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
ve using MinusStringihtiyacınız olan yerlere blokların önüne ekleyin .
işte ne yapardım
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!"
Birden çok satırda biçimlendirilmiş:
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
ÖÖrneğin OP kaldırılmasını istemedi .
[]Patlamayan sürüm için s de kullanabilirsiniz .