Удалить подстроку из строки - PullRequest
178 голосов
/ 20 марта 2011

Мне просто интересно, есть ли способ удалить строку из другой строки?Как то так:

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

Ответы [ 10 ]

248 голосов
/ 20 марта 2011

Вы можете использовать метод среза:

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

есть не '!'версия также.Дополнительную информацию можно найти в документации по другим версиям: http://www.ruby -doc.org / core / classes / String.html # M001213

151 голосов
/ 20 марта 2011

Как насчет str.gsub("subString", "") Проверьте Ruby Doc

93 голосов
/ 19 мая 2015

Если это конец строки, вы также можете использовать chomp:

"hello".chomp("llo")     #=> "he"
42 голосов
/ 20 марта 2011

Если у вас есть только одно вхождение целевой строки, вы можете использовать:

str[target] = ''

или

str.sub(target, '')

Если у вас есть несколько случаев использования цели:

str.gsub(target, '')

Например:

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 "

Если вам нужно выполнить замену на месте, используйте "!" версии gsub! и sub!.

23 голосов
/ 15 декабря 2016

Если вы используете Rails, есть также remove.

например. "Testmessage".remove("message") урожайность "Test".

Предупреждение: этот метод удаляет все вхождения

13 голосов
/ 26 июня 2018

Если ваша подстрока находится в начале или в конце строки, то в Ruby 2.5 были введены следующие методы:

  • delete_prefix для удаления подстроки изначало строки
  • delete_suffix для удаления подстроки из конца строки
2 голосов
/ 24 апреля 2017

Если вы используете рельсы или используете менее активную поддержку, вы получаете String # remove и String # remove! метод

def remove!(*patterns)
  patterns.each do |pattern|
    gsub! pattern, ""
  end

  self
end

источник: http://api.rubyonrails.org/classes/String.html#method-i-remove

1 голос
/ 25 февраля 2017

Если я правильно интерпретирую, этот вопрос, кажется, требует что-то вроде операции минус (-) между строками, то есть противоположности встроенной операции плюс (+) (конкатенация).

В отличие от предыдущих ответов, я пытаюсь определить такую ​​операцию, которая должна подчиняться свойству:

IF c = a + b THEN c - a = b AND c - b = a

Для этого нам нужно всего три встроенных метода Ruby:

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

Я не буду объяснять, как это работает, потому чтоэто легко понять, запуская один метод за один раз.

Вот пример кода концепции:

# 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

Последнее слово, если вы используете последнюю версию Ruby (> = 2.0): используйте уточнения вместо строки обезьяны-патчинга, как в предыдущем примере.

Это так же просто, как:

module MinusString
  refine String do
    def -(str)
      partition(str).values_at(0,2).join
    end
  end
end

и добавьте using MinusString перед блоками, где вам это нужно.

0 голосов
/ 03 августа 2015

вот что я бы сделал

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!" 

Отформатировано в несколько строк:

class String
    def remove!(start_index, end_index)
        (end_index - start_index + 1).times{ self.slice! start_index }
        self
    end 
end
0 голосов
/ 27 июня 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...