Réponses:
Vous pouvez utiliser la méthode slice:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
il y a un non '!' version aussi. Plus d'informations peuvent également être consultées dans la documentation des autres versions: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
delete
ne fonctionnerait pas, car il supprime tous les personnages que vous passez:'hello world'.delete('hello') #=> ' wrd'
Que diriez-vous de str.gsub("subString", "")
consulter le Doc Ruby
sub
serait plus approprié que gsub
, puisque l'OP ne souhaite supprimer la sous-chaîne qu'au début de la chaîne, pas tout au long de la chaîne (regardez son exemple de code). Et l'utilisation d'une expression régulière, comme celle-ci, serait mieux: str.sub(/^subString/, '')
- car elle garantit que la sous-chaîne ne sera définitivement supprimée que depuis le début.
subString
n'inclut aucun caractère spécial regex.
/^subString/
est un littéral, nous pouvons donc être sûrs qu'il ne contient aucun métacaractère. Si vous substituez une autre chaîne en une expression régulière, vous pouvez le faire: /#{Regexp.escape(str)}/
.
Regexp.escape()
, cependant.
S'il s'agit de la fin de la chaîne, vous pouvez également utiliser chomp
:
"hello".chomp("llo") #=> "he"
chomp
en combinaison avec reverse
:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Si vous n'avez qu'une seule occurrence de la chaîne cible, vous pouvez utiliser:
str[target] = ''
ou
str.sub(target, '')
Si vous avez plusieurs occurrences d'utilisation cible:
str.gsub(target, '')
Par exemple:
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 vous devez effectuer des substitutions sur place, utilisez les "!"
versions de gsub!
et sub!
.
asdf['bar'] = ''
Si vous utilisez Rails, il y en a aussi remove
.
Par exemple, les "Testmessage".remove("message")
rendements "Test"
.
Attention: cette méthode supprime toutes les occurrences
slice
méthode ne renvoie pas la partie de la chaîne qui est tranchée, elle renvoie le "couteau"
slice!
def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
Si votre sous-chaîne se trouve au début ou à la fin d'une chaîne, alors Ruby 2.5 a introduit les méthodes pour cela:
Si vous utilisez des rails ou un support moins actif, vous avez obtenu String # remove et String # remove! méthode
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
source: http://api.rubyonrails.org/classes/String.html#method-i-remove
Si j'interprète correctement, cette question semble demander quelque chose comme une opération moins (-) entre les chaînes, c'est-à-dire l'opposé de l'opération plus (+) intégrée (concaténation).
Contrairement aux réponses précédentes, j'essaie de définir une telle opération qui doit obéir à la propriété:
SI c = a + b ALORS c - a = b ET c - b = a
Pour ce faire, nous n'avons besoin que de trois méthodes Ruby intégrées:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'
.
Je ne vais pas expliquer comment cela fonctionne, car il peut être facilement compris en exécutant une méthode à la fois.
Voici un code de preuve de concept:
# 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 dernier conseil si vous utilisez une version récente de Ruby (> = 2.0): utilisez des raffinements au lieu de singe-patching String comme dans l'exemple précédent.
C'est aussi simple que:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
et ajoutez using MinusString
avant les blocs où vous en avez besoin.
voici ce que je ferais
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!"
Formaté sur plusieurs lignes:
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
Ö
par exemple.
[]
s pour la version non-bang.