Respostas:
Você pode usar o método de fatia:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
existe um não '!' versão também. Mais informações podem ser vistas na documentação sobre outras versões: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
delete
não funcionaria, pois exclui todos os caracteres que você digita : #'hello world'.delete('hello') #=> ' wrd'
Que tal str.gsub("subString", "")
Confira o Doc Ruby
sub
seria mais apropriado do que gsub
, já que o OP deseja remover a substring desde o início da string, não toda a string (veja seu código de exemplo). E usar um regex, como este, seria melhor: str.sub(/^subString/, '')
- porque garante que a substring será definitivamente removida apenas desde o início.
subString
que não inclui nenhum caractere especial de regex.
/^subString/
é literal, portanto podemos ter certeza de que não inclui nenhum metacaractere. Se você estiver substituindo alguma outra string em uma regex, você pode fazer isso: /#{Regexp.escape(str)}/
.
Regexp.escape()
, no entanto.
Se for o fim da cadeia, você também pode usar chomp
:
"hello".chomp("llo") #=> "he"
chomp
em combinação com reverse
:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Se você tiver apenas uma ocorrência da sequência de destino, poderá usar:
str[target] = ''
ou
str.sub(target, '')
Se você tiver várias ocorrências de uso de destino:
str.gsub(target, '')
Por exemplo:
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 você precisar fazer substituições no local, use as "!"
versões de gsub!
e sub!
.
asdf['bar'] = ''
Se você estiver usando o Rails, também há remove
.
Por exemplo, "Testmessage".remove("message")
rendimentos "Test"
.
Aviso: este método remove todas as ocorrências
slice
método não retorna a parte da cadeia de caracteres que é cortado, ele retorna a "faca"
slice!
def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
Se sua substring está no início de no final de uma string, o Ruby 2.5 introduziu os métodos para isso:
Se você estiver usando trilhos ou com menos suporte ativo, você receberá as String # remove e String # remove! método
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
fonte: http://api.rubyonrails.org/classes/String.html#method-i-remove
Se estou interpretando corretamente, essa pergunta parece pedir algo como uma operação de menos (-) entre seqüências de caracteres, ou seja, o oposto da operação interna de mais (+) (concatenação).
Diferentemente das respostas anteriores, estou tentando definir uma operação que deve obedecer à propriedade:
Se c = a + b ENTÃO c - a = b AND c - b = a
Precisamos apenas de três métodos Ruby internos para conseguir isso:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'
.
Não vou explicar como funciona, porque pode ser facilmente entendido executando um método de cada vez.
Aqui está uma prova de código de conceito:
# 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
Um último conselho, se você estiver usando uma versão recente do Ruby (> = 2.0): use Refinements vez de String de correção de macacos, como no exemplo anterior.
É tão fácil quanto:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
e adicione using MinusString
antes dos blocos onde você precisar.
aqui está o que eu faria
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!"
Formatado em várias linhas:
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
Ö
por exemplo.
[]
s para a versão non-bang.