Risposte:
Puoi usare il metodo slice:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
c'è un non '!' anche la versione. Maggiori informazioni sono disponibili nella documentazione anche su altre versioni: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
deletenon funzionerebbe, poiché cancella tutti i personaggi in cui passi:'hello world'.delete('hello') #=> ' wrd'
Che ne dite di str.gsub("subString", "")
controllare il Ruby Doc
subsarebbe più appropriato di gsub, poiché l'OP vuole solo rimuovere la sottostringa dall'inizio della stringa, non tutta la stringa (guarda il suo codice di esempio). E usare una regex, come questa, sarebbe meglio: str.sub(/^subString/, '')- perché assicura che la sottostringa verrà definitivamente rimossa solo dall'inizio.
subStringche non includa caratteri speciali regex.
/^subString/è letterale, quindi possiamo essere certi che non includa metacaratteri. Se si sta sostituendo qualche altra stringa in un'espressione regolare, si può fare questo: /#{Regexp.escape(str)}/.
Regexp.escape(), però.
Se è la fine della stringa, puoi anche usare chomp:
"hello".chomp("llo") #=> "he"
chompin combinazione con reverse:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Se hai una sola occorrenza della stringa di destinazione puoi usare:
str[target] = ''
o
str.sub(target, '')
Se hai più occorrenze di destinazione d'uso:
str.gsub(target, '')
Per esempio:
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 "
Se è necessario eseguire sostituzioni sul posto, utilizzare le "!"versioni di gsub!e sub!.
asdf['bar'] = ''
Se stai usando Rails c'è anche remove.
Ad esempio "Testmessage".remove("message")rese "Test".
Attenzione: questo metodo rimuove tutte le occorrenze
slicemetodo non restituisce la parte della stringa che viene tagliata, ma restituisce il "coltello"
slice! def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
Se la sottostringa si trova all'inizio della fine di una stringa, Ruby 2.5 ha introdotto i metodi per questo:
Se stai usando rotaie o con meno supporto attivo hai String # remove e String # remove! metodo
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
fonte: http://api.rubyonrails.org/classes/String.html#method-i-remove
Se sto interpretando bene, questa domanda sembra richiedere qualcosa come un'operazione meno (-) tra le stringhe, ovvero l'opposto dell'operazione incorporata più (+) (concatenazione).
A differenza delle risposte precedenti, sto cercando di definire un'operazione del genere che deve obbedire alla proprietà:
SE c = a + b POI c - a = b AND c - b = a
Abbiamo bisogno solo di tre metodi Ruby integrati per raggiungere questo obiettivo:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'.
Non spiegherò come funziona perché può essere facilmente compreso eseguendo un metodo alla volta.
Ecco un codice di prova del concetto:
# 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
Un'ultima parola di consiglio se stai usando una versione recente di Ruby (> = 2.0): usa i perfezionamenti invece della stringa di patch delle scimmie come nell'esempio precedente.
È facile come:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
e aggiungi using MinusStringprima dei blocchi dove ne hai bisogno.
ecco cosa farei
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!"
Formattato su più righe:
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
Öad esempio.
[]s per la versione non bang.