Antworten:
Sie können die Slice-Methode verwenden:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
es gibt ein nicht '!' Version auch. Weitere Informationen finden Sie auch in der Dokumentation zu anderen Versionen: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
delete
würde nicht funktionieren, da es alle Zeichen löscht, die Sie übergeben:'hello world'.delete('hello') #=> ' wrd'
Wie wäre es mit str.gsub("subString", "")
dem Ruby Doc
sub
wäre angemessener als gsub
, da das OP nur den Teilstring vom Anfang des Strings entfernen möchte , nicht den gesamten String (siehe seinen Beispielcode). Und die Verwendung eines solchen regulären Ausdrucks wäre besser: str.sub(/^subString/, '')
- weil dadurch sichergestellt wird, dass der Teilstring definitiv nur von Anfang an entfernt wird.
subString
sind, dass keine regulären Ausdruckszeichen enthalten sind.
/^subString/
ein Literal, daher können wir sehr sicher sein, dass es keine Metazeichen enthält. Wenn Sie eine andere Zeichenfolge durch eine Regex ersetzen, können Sie Folgendes tun : /#{Regexp.escape(str)}/
.
Regexp.escape()
.
Wenn es das Ende der Zeichenfolge ist, können Sie auch Folgendes verwenden chomp
:
"hello".chomp("llo") #=> "he"
chomp
in Kombination mit verwenden reverse
:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Wenn Sie nur ein Vorkommen der Zielzeichenfolge haben, können Sie Folgendes verwenden:
str[target] = ''
oder
str.sub(target, '')
Wenn Sie mehrere Ziele verwenden:
str.gsub(target, '')
Zum Beispiel:
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 "
Wenn Sie direkte Ersetzungen vornehmen müssen, verwenden Sie die "!"
Versionen von gsub!
und sub!
.
asdf['bar'] = ''
Wenn Sie Rails verwenden, gibt es auch remove
.
ZB "Testmessage".remove("message")
ergibt "Test"
.
Warnung: Diese Methode entfernt alle Vorkommen
slice
Methode nicht den Teil der Schnur zurück, der in Scheiben geschnitten wurde, sondern das "Messer"
slice!
def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
Wenn sich Ihre Teilzeichenfolge am Anfang am Ende einer Zeichenfolge befindet, hat Ruby 2.5 die folgenden Methoden eingeführt:
Wenn Sie Schienen verwenden oder weniger aktiv sind, erhalten Sie String # remove und String # remove! Methode
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
Quelle: http://api.rubyonrails.org/classes/String.html#method-i-remove
Wenn ich richtig interpretiere, scheint diese Frage nach einer Minusoperation (-) zwischen Zeichenfolgen zu fragen, dh nach dem Gegenteil der integrierten Plusoperation (+) (Verkettung).
Im Gegensatz zu den vorherigen Antworten versuche ich, eine solche Operation zu definieren, die der Eigenschaft gehorchen muss:
WENN c = a + b DANN c - a = b UND c - b = a
Wir benötigen nur drei integrierte Ruby-Methoden, um dies zu erreichen:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'
.
Ich werde nicht erklären, wie es funktioniert, da es leicht zu verstehen ist, jeweils eine Methode auszuführen.
Hier ist ein Proof-of-Concept-Code:
# 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
Ein letzter Ratschlag, wenn Sie eine aktuelle Ruby-Version verwenden (> = 2.0): Verwenden Sie Verfeinerungen anstelle von Affen-Patching-Zeichenfolgen wie im vorherigen Beispiel.
Es ist so einfach wie:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
und fügen Sie using MinusString
vor den Blöcken hinzu, wo Sie es brauchen.
Hier ist was ich tun würde
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!"
In mehreren Zeilen formatiert:
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
Ö
zum Beispiel nicht darum gebeten, es zu entfernen .
[]
s auch für die Non-Bang-Version verwenden.