Respuestas:
Puedes usar el método de corte:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
hay un no '!' versión también. También se puede ver más información en la documentación sobre otras versiones: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
delete
no funcionaría, ya que elimina todos los caracteres que pasas:'hello world'.delete('hello') #=> ' wrd'
¿Qué tal si str.gsub("subString", "")
echas un vistazo al Ruby Doc?
sub
sería más apropiado que gsub
, ya que el OP solo quiere eliminar la subcadena desde el comienzo de la cadena, no todo a través de la cadena (mira su código de muestra). Y usar una expresión regular, como esta, sería mejor: str.sub(/^subString/, '')
- porque asegura que la subcadena definitivamente se eliminará solo desde el principio.
subString
que no incluye ningún carácter especial de expresión regular.
/^subString/
es un literal, por lo que podemos estar muy seguros de que no incluye metacaracteres. Si está sustituyendo alguna otra cadena en una expresión regular, usted puede hacer esto: /#{Regexp.escape(str)}/
.
Regexp.escape()
, sin embargo.
Si es el final de la cadena, también puede usar chomp
:
"hello".chomp("llo") #=> "he"
chomp
en combinación con reverse
:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Si solo tiene una aparición de la cadena de destino, puede usar:
str[target] = ''
o
str.sub(target, '')
Si tiene múltiples ocurrencias de uso objetivo:
str.gsub(target, '')
Por ejemplo:
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 "
Si necesita hacer sustituciones en el lugar, use las "!"
versiones de gsub!
y sub!
.
asdf['bar'] = ''
Si está utilizando Rails también hay remove
.
Por ejemplo, "Testmessage".remove("message")
rendimientos "Test"
.
Advertencia: este método elimina todas las ocurrencias
slice
método no devuelve la porción de la cuerda que se ha cortado, devuelve el "cuchillo"
slice!
def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
Si su subcadena está al principio o al final de una cadena, Ruby 2.5 ha introducido los métodos para esto:
Si está utilizando rieles o con un soporte menos activo, obtendrá String # remove y String # remove. método
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
fuente: http://api.rubyonrails.org/classes/String.html#method-i-remove
Si estoy interpretando bien, esta pregunta parece pedir algo así como una operación menos (-) entre cadenas, es decir, lo opuesto a la operación incorporada más (+) (concatenación).
A diferencia de las respuestas anteriores, estoy tratando de definir una operación que deba obedecer la propiedad:
SI c = a + b ENTONCES c - a = b Y c - b = a
Solo necesitamos tres métodos de Ruby integrados para lograr esto:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'
.
No explicaré cómo funciona porque se puede entender fácilmente ejecutando un método a la vez.
Aquí hay un código de prueba de concepto:
# 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 último consejo si está utilizando una versión reciente de Ruby (> = 2.0): use Refinamientos lugar de Cadenas de parches de mono como en el ejemplo anterior.
Es tan fácil como:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
y agregue using MinusString
antes de los bloques donde lo necesite.
esto es lo que haría
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!"
Formateado en múltiples líneas:
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 ejemplo.
[]
s para la versión no explosiva.