Odpowiedzi:
Możesz użyć metody wycinania:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
istnieje non „!” również wersja. Więcej informacji można również znaleźć w dokumentacji innych wersji: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
deletenie działa, ponieważ usuwa wszystkie znaki, które przekazujesz:'hello world'.delete('hello') #=> ' wrd'
Co powiesz na str.gsub("subString", "")
sprawdzenie Ruby Doc
subbyłoby bardziej odpowiednie niż gsub, ponieważ OP chce tylko usunąć podłańcuch z początku łańcucha, nie przez cały łańcuch (spójrz na jego przykładowy kod). A użycie wyrażenia regularnego, takiego jak ten, byłoby lepsze: str.sub(/^subString/, '')- ponieważ zapewnia, że podciąg będzie zdecydowanie usuwany od samego początku.
subStringże nie zawiera żadnych znaków specjalnych wyrażenia regularnego.
/^subString/jest dosłowny, więc możemy być pewni, że nie zawiera żadnych metaznaków. Jeśli podstawiając inny ciąg znaków w regex, można to zrobić: /#{Regexp.escape(str)}/.
Regexp.escape().
Jeśli jest to koniec ciągu, możesz także użyć chomp:
"hello".chomp("llo") #=> "he"
chompw połączeniu z reverse:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Jeśli masz tylko jedno wystąpienie ciągu docelowego, możesz użyć:
str[target] = ''
lub
str.sub(target, '')
Jeśli masz wiele wystąpień celu docelowego:
str.gsub(target, '')
Na przykład:
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 "
Jeśli chcesz dokonać zamiany w miejscu, użyj "!"wersji gsub!i sub!.
asdf['bar'] = ''
Jeśli używasz Railsów, jest tam również remove.
Np . "Testmessage".remove("message")Plony "Test".
Ostrzeżenie: ta metoda usuwa wszystkie wystąpienia
slicemetoda nie zwraca części ciętego sznurka, ale zwraca „nóż”
slice! def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
Jeśli twój podciąg znajduje się na początku łańcucha, to Ruby 2.5 wprowadził następujące metody:
Jeśli używasz szyn lub mniej aktywnego wsparcia, masz String # remove i String # remove! metoda
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
źródło: http://api.rubyonrails.org/classes/String.html#method-i-remove
Jeśli dobrze interpretuję, to pytanie wydaje się wymagać czegoś takiego jak operacja minus (-) między łańcuchami, tj. Przeciwieństwo wbudowanej operacji plus (+) (konkatenacja).
W przeciwieństwie do poprzednich odpowiedzi próbuję zdefiniować taką operację, która musi być zgodna z właściwością:
JEŚLI c = a + b NASTĘPNIE c - a = b ORAZ c - b = a
Potrzebujemy tylko trzech wbudowanych metod Ruby, aby to osiągnąć:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'.
Nie wyjaśnię, jak to działa, ponieważ można to łatwo zrozumieć, uruchamiając jedną metodę na raz.
Oto kod dowodu koncepcji:
# 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
Ostatnie słowo porady, jeśli używasz najnowszej wersji Rubiego (> = 2.0): użyj Uściśleń zamiast ciągów małpich łatek, jak w poprzednim przykładzie.
Jest to tak proste jak:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
i dodaj using MinusStringprzed blokami tam, gdzie jest to potrzebne.
oto co bym zrobił
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!"
Sformatowany w wielu wierszach:
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
Öna przykład o usunięcie .
[]s dla wersji innej niż Bang.