Вы можете использовать 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)?)
также работает) - это позитивный взгляд, заключенный в группу захвата.Это требует, чтобы за конкретным местоположением в строке сразу же следовало содержимое просмотра, но оно не было частью самого совпадения.Знак вопроса делает предпросмотр необязательным.