Ruby global match regexp?
В других языках regexp вы можете использовать //g для глобального соответствия.
Однако в Ruby:
"hello hello".match /(hello)/
Захватывает только один привет
Как я могу захватить все приветствия?
Ответы
Ответ 1
Вы можете использовать метод сканирования. Метод сканирования либо даст вам массив всех совпадений, либо, если вы передадите ему блок, передайте каждое соответствие блоку.
"hello1 hello2".scan(/(hello\d+)/) # => [["hello1"], ["hello2"]]
"hello1 hello2".scan(/(hello\d+)/).each do|m|
puts m
end
Я написал об этом методе, вы можете прочитать об этом здесь в конце статьи.
Ответ 2
используйте String#scan
. Он вернет массив каждого совпадения, или вы можете передать блок, и он будет вызываться с каждым соответствием.
Все подробности в http://ruby-doc.org/core/classes/String.html#M000812
Ответ 3
Вот совет для любого, кто ищет способ заменить все регулярные выражения на что-то еще.
Вместо флага //g и одного метода подстановки, как и многие другие языки, Ruby использует вместо него два разных метода.
# .sub — Replace the first
"ABABA".sub(/B/, '') # AABA
# .gsub — Replace all
"ABABA".gsub(/B/, '') # AAA