Удалить подстроки в ruby - PullRequest
       14

Удалить подстроки в ruby

4 голосов
/ 05 февраля 2010

Учитывая массив строк,

array1 = ["abcdwillbegoneabcccc","cdefwilbegokkkabcdc"]

и другой массив строк, состоящий из шаблонов, например ["abcd","beg[o|p]n","bcc","cdef","h*gxwy"]

задача состоит в том, чтобы удалить подстроки, которые соответствуют любой из строк шаблона. например, пример вывода для этого случая должен быть:

["willbegonea","wilbegokkk"]

потому что мы удалили подстроки (prematch или postmatch, в зависимости от ситуации вхождения), которые соответствуют одному из шаблонов. Предположим, что одно или два совпадения всегда будут иметь место в начале или ближе к концу каждой строки в массиве1.

Есть идеи элегантного решения вышеперечисленного в рубине?

Ответы [ 3 ]

7 голосов
/ 05 февраля 2010

Как насчет создания одного регулярного выражения?

array1 = ["abcdwillbegoneabcccc","cdefwilbegokkkabcdc"]

to_remove = ["abcd","beg[o|p]n","bcc","cdef","h*gxwy"]

reg = Regexp.new(to_remove.map{ |s| "(#{s})" }.join('|'))
#=> /(abcd)|(beg[o|p]n)|(bcc)|(cdef)|(h*gxwy)/

array1.map{ |s| s.gsub(reg, '') }
#=>  ["willeacc", "wilbegokkkc"]

Обратите внимание, что мой результат отличается от вашего

["willbegonea","wilbegokkk"]

но я думаю, что это правильно, он удаляет "abcd", "begon" и "bcc" из оригинала, что, кажется, то, что нужно.

2 голосов
/ 05 февраля 2010

Здесь я вижу некоторые потенциальные ошибки: если вы измените порядок строк шаблона, вы можете получить другой результат; кроме того, второй шаблон может оставить строку в состоянии, которое соответствовало бы первому, только сейчас уже слишком поздно.

Предполагая, что это данность, я согласился бы с ответом Йоанна. Единственный способ, которым я могу немного улучшить это, это сделать регулярные выражения, а не строки, например:

[/abcd/,/beg[o|p]n/,/bcc/,/cdef/,/h*gxwy/].each do |pattern|
    string_to_test.gsub!(pattern,'')
end

Но, конечно, если шаблоны приходят откуда-то еще, возможно, они должны быть строками.

1 голос
/ 05 февраля 2010

Я думаю, что-то подобное должно работать:

def gimme_the_substring(string_to_test)
  ["abcd","beg[o|p]n","bcc","cdef","h*gxwy"].each do |pattern|
    string_to_test.gsub!(/#{pattern}/,'')
  end
  return string_to_test
end

array1.map!{|s| gimme_the_substring(s)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...