web-dev-qa-db-fra.com

Supprimer la sous-chaîne de la chaîne

Je me demande simplement s'il existe une méthode permettant de supprimer une chaîne d'une autre chaîne?

class String
  def remove(s)
    self[s.length, self.length - s.length]
  end
end
169
demas

Vous pouvez utiliser la méthode slice:

a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"

il y a un non '!' version aussi bien. Plus d'informations sont également disponibles dans la documentation sur les autres versions: http://www.Ruby-doc.org/core/classes/String.html#M001213

237
Pete

Que diriez-vous de str.gsub("subString", "") Découvrez le Ruby Doc

145
Piyush Mattoo

Si c'est la fin de la chaîne, vous pouvez aussi utiliser chomp :

"hello".chomp("llo")     #=> "he"
87

Si vous n'avez qu'une 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!.

42
the Tin Man

Si vous utilisez Rails, il y a aussi remove .

Par exemple. "Testmessage".remove("message") donne "Test".

Attention: cette méthode supprime les occurrences de toutes

19
edwardmp

Si votre sous-chaîne est au début ou à la fin d'une chaîne, Ruby 2.5 a introduit les méthodes pour cela:

  • delete_prefix pour supprimer une sous-chaîne au début de la chaîne
  • delete_suffix pour supprimer une sous-chaîne de la fin de la chaîne
11
Igor Drozdov

Si vous utilisez Rails ou un support moins actif, vous avez 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

2
Dinatih

Si j'interprète bien, cette question semble demander quelque chose comme une opération moins (-) entre 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 cela, il suffit de trois méthodes Ruby intégrées:

'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'.

Je n'expliquerai pas comment cela fonctionne car il est facile de comprendre 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 Refinements au lieu de monkey-patcher Chaîne 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.

0
Claudio Floreani