Je me demande simplement s'il existe une méthode pour supprimer une chaîne d'une autre chaîne? Quelque chose comme ça:
class String
def remove(s)
self[s.length, self.length - s.length]
end
end
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
[]
s pour la version non-bang."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 Rubyla source
sub
serait plus approprié quegsub
, 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
:la source
chomp
en combinaison avecreverse
:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Si vous n'avez qu'une seule occurrence de la chaîne cible, vous pouvez utiliser:
ou
Si vous avez plusieurs occurrences d'utilisation cible:
Par exemple:
Si vous devez effectuer des substitutions sur place, utilisez les
"!"
versions degsub!
etsub!
.la source
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
la source
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
Ruby 2.5+
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:
la source
Si vous utilisez des rails ou un support moins actif, vous avez obtenu String # remove et String # remove! méthode
source: http://api.rubyonrails.org/classes/String.html#method-i-remove
la source
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:
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:
et ajoutez
using MinusString
avant les blocs où vous en avez besoin.la source
voici ce que je ferais
Formaté sur plusieurs lignes:
la source
la source
Ö
par exemple.