Совпадение всех появлений регулярного выражения

Есть ли быстрый способ найти каждое соответствие регулярного выражения в Ruby? Я просмотрел объект Regex в Ruby STL и искал в Google безрезультатно.

Ответ 1

Использование scan должно сделать трюк:

string.scan(/regex/)

Ответ 2

Чтобы найти все соответствующие строки, используйте 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 в ruby ​​будет очень полезно.

Ответ 3

если у вас есть регулярное выражение с группами:

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

Для поиска сопоставимых групп используется метод проверки строки:

str.scan re
#> [["54"], ["1"], ["3"]]

Чтобы найти соответствующий шаблон:

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]