Zastanawiam się tylko, czy istnieje metoda usunięcia ciągu z innego ciągu? Coś takiego:
class String
def remove(s)
self[s.length, self.length - s.length]
end
end
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
[]
s dla wersji innej niż Bang."foobar".tap{|s| s.slice!("foo")}.upcase
delete
nie działa, ponieważ usuwa wszystkie znaki, które przekazujesz:'hello world'.delete('hello') #=> ' wrd'
Co powiesz na
str.gsub("subString", "")
sprawdzenie Ruby Docźródło
sub
był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
:źródło
chomp
w połączeniu zreverse
:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Jeśli masz tylko jedno wystąpienie ciągu docelowego, możesz użyć:
lub
Jeśli masz wiele wystąpień celu docelowego:
Na przykład:
Jeśli chcesz dokonać zamiany w miejscu, użyj
"!"
wersjigsub!
isub!
.źródło
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
źródło
slice
metoda 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
Ruby 2.5+
Jeśli twój podciąg znajduje się na początku łańcucha, to Ruby 2.5 wprowadził następujące metody:
źródło
Jeśli używasz szyn lub mniej aktywnego wsparcia, masz String # remove i String # remove! metoda
źródło: http://api.rubyonrails.org/classes/String.html#method-i-remove
źródło
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:
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:
i dodaj
using MinusString
przed blokami tam, gdzie jest to potrzebne.źródło
oto co bym zrobił
Sformatowany w wielu wierszach:
źródło
źródło
Ö
na przykład o usunięcie .