Ruby regex: совпадение и получение позиций (позиций)

Я хотел бы совместить регулярное выражение и получить позицию в строке соответствия

Например,

"AustinTexasDallasTexas".match_with_posn /(Texas)/

Мне бы хотелось, чтобы match_with_posn возвращал что-то вроде: [6, 17], где 6 и 17 - начальные позиции для обоих экземпляров слова Texas.

Есть ли что-нибудь подобное?

Ответ 1

Используя Ruby 1.8.6+, вы можете сделать это:

require 'enumerator' #Only for 1.8.6, newer versions should not need this.

s = "AustinTexasDallasTexas"
positions = s.enum_for(:scan, /Texas/).map { Regexp.last_match.begin(0) }

Это создаст массив с:

=> [6, 17]

Ответ 2

Сортировка, см. String#index

"AustinTexasDallasTexas".index /Texas/
=> 6

Теперь вы можете расширить API-интерфейс String.

class String
  def indices e
    start, result = -1, []
    result << start while start = (self.index e, start + 1)
    result
  end
end
p "AustinTexasDallasTexas".indices /Texas/
=> [6, 17]