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
delete
tüm karakterleri sildiği için işe yaramaz:'hello world'.delete('hello') #=> ' wrd'
Nereden str.gsub("subString", "")
kontrol edin Yakut Doc
sub
gsub
OP, 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.
subString
herhangi 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"
chomp
reverse
"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
slice
yö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 MinusString
ihtiyacı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 .