Для поиска всех подходящих строк используйте метод scan
класса String
.
str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]
Если вы предпочитаете MatchData
, который является типом объекта, возвращаемого методом match
класса Regexp
, используйте следующее
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]
Преимущество MatchData
в том, что вы можете использовать такие методы, как offset
match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]
Пошлите также эти вопросы, если хотите узнать больше
Как получить данные о совпадении для всех вхождений регулярного выражения Ruby в строке?
Перечислитель с регулярным выражением Ruby с поддержкой именованного захвата
Как узнать начальную точку для каждого матча в рубине
Чтение о специальных переменных $&
, $'
, $1
, $2
в рубине будет очень полезным.