it-swarm-ru.tech

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

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

558
Chris Bunch

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

string.scan(/regex/)
787
Jean

Чтобы найти все подходящие строки, используйте scan метод класса String.

str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]

Если вы предпочитаете MatchData , который является типом возвращаемого объекта, метод match из Regexp classs, используйте следующее

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 с именованной поддержкой перехвата
Как узнать начальную точку для каждого матча в Ruby

Чтение специальных переменных $&, $', $1, $2 в Ruby будет очень полезным.

57
sudo bangbang

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

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"]
11
MVP