Строка включает в себя подстроки из массивов - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть следующее:

input string = "1234"
output new_array should = [12, 3, 4, 34]

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать String # scan (см. Последнее предложение документа) вместе с регулярным выражением.Моя цель - продемонстрировать этот подход, а не предположить, что он должен быть предпочтительным.

nouns = ["cdef", "d", "fgh", "i", "jk", "bcd"]
verbs = ["cd", "ef", "f", "jkl", "abc"]

R = Regexp.new (nouns+verbs).map { |s| "(?=(#{s}))?" }.join
  #=> /(?=(cdef))?(?=(d))?(?=(fgh))?(?=(i))?(?=(jk))?(?=(bcd))?(?=(cd))?(?=(ef))?(?=(f))?(?=(jkl))?(?=(abc))?/ 

def string_to_array(str, nouns, strings)
  str.scan(R).flatten.compact
end

str = "cdef"

string_to_array(str, nouns, verbs)
  #=> ["cdef", "cd", "d", "ef", "f"]

Примечание:

str.scan(R)
  #=> [["cdef", nil, nil, nil, nil, nil, "cd", nil, nil, nil, nil],
  #    [nil, "d", nil, nil, nil, nil, nil, nil, nil, nil, nil],
  #    [nil, nil, nil, nil, nil, nil, nil, "ef", nil, nil, nil],
  #    [nil, nil, nil, nil, nil, nil, nil, nil, "f", nil, nil],
  #    [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]] 

(?=(cdef))? ((?=(cdef)?) также работает) - это позитивный взгляд, заключенный в группу захвата.Это требует, чтобы за конкретным местоположением в строке сразу же следовало содержимое просмотра, но оно не было частью самого совпадения.Знак вопроса делает предпросмотр необязательным.

0 голосов
/ 27 февраля 2019
def string_to_array(string)
  noun = ["d", "fgh", "i", "jk", "bcd", "cdef"]
  verb = ["cd", "ef", "f", "jkl", "abc"]

  ary = (noun+verb).select { |s| string.include? s }
  ary.unshift(ary.delete(string)).compact
end

string = "cdef"

string_to_array(string) #=> ["cdef", "d", "cd", "ef", "f"]

Я использовал Array#select, Array#+, Array#delete, Array#unshift, Array#compact и String#include?.

Если вы хотите удалить дубликаты из выходного массива, используйте Array#uniq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...