Ruby глобальное совпадение регулярное выражение? - PullRequest
50 голосов
/ 28 августа 2010

В других языках регулярное выражение можно использовать // g для глобального сопоставления.

Однако в Ruby:

"hello hello".match /(hello)/

Захватывает только один привет

Как сделатьЯ захватил все привет?

Ответы [ 3 ]

67 голосов
/ 28 августа 2010

Вы можете использовать метод сканирования.Метод сканирования либо выдаст вам массив всех совпадений, либо, если вы передадите ему блок, передаст каждое совпадение в блок.

"hello1 hello2".scan(/(hello\d+)/)   # => [["hello1"], ["hello2"]]

"hello1 hello2".scan(/(hello\d+)/).each do|m|
  puts m
end

Я написал об этом методе, вы можете прочитать оэто здесь в конце статьи.

12 голосов
/ 28 августа 2010

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

Все подробности на http://ruby -doc.org / core / classes / String.html # M000812

8 голосов
/ 11 ноября 2015

Вот совет для тех, кто ищет способ заменить все совпадения регулярных выражений чем-то другим.

Вместо флага // g и одного метода подстановки, как и во многих других языках, Ruby использует два разных метода.

# .sub — Replace the first
"ABABA".sub(/B/, '') # AABA

# .gsub — Replace all
"ABABA".gsub(/B/, '') # AAA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...