Сопоставить все вхождения регулярного выражения - PullRequest
558 голосов
/ 17 сентября 2008

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

Ответы [ 3 ]

786 голосов
/ 17 сентября 2008

Использование scan должно помочь:

string.scan(/regex/)
57 голосов
/ 13 марта 2016

Для поиска всех подходящих строк используйте метод 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 в рубине будет очень полезным.

11 голосов
/ 20 апреля 2016

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

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...