Ваш образец и обновление не работают:
Update:
/string\d+/.match(word) returns "chance1"
This seems to be working.
Выгрузка в IRB показывает:
>> string = "test0 chance1 already0 again4" #=> "test0 chance1 already0 again4"
>> word = "chance" #=> "chance"
>> /string\d+/.match(word) #=> nil
, так что не работает.
IРекомендую:
>> Hash[*string.scan(/(\w+)(\d)/).flatten]['chance'] #=> "1"
или
>> hash = Hash[*string.scan(/(\w+)(\d)/).flatten]
>> hash['chance'] #=> "1"
>> hash['test'] #=> "0"
>> hash['again'] #=> "4"
Работает путем сканирования слов, заканчивающихся цифрой, и раздельного захвата слова и цифры.String.scan вернет массив массивов, где каждый внутренний массив содержит соответствующие группы.
>> string.scan(/(\w+)(\d)/) #=> [["test", "0"], ["chance", "1"], ["already", "0"], ["again", "4"]]
Затем я выравниваю его, чтобы получить список слов, за которым следует их совпадающая цифра
>> string.scan(/(\w+)(\d)/).flatten #=> ["test", "0", "chance", "1", "already", "0", "again", "4"]
, и превращаю его в хеш.
>> Hash[*string.scan(/(\w+)(\d)/).flatten] #=> {"test"=>"0", "chance"=>"1", "already"=>"0", "again"=>"4"}
Тогда это простой случай запроса хэша для значения, которое соответствует определенному слову.
String.scan является мощным, но часто упускается из виду.Для программистов на Perl это похоже на использование сопоставления с шаблоном m//g
.
Вот немного другой способ заполнения хеша:
>> string.scan(/(\w+)(\d)/).inject({}){|h,a| h[a[0]]=a[1]; h} #=> {"test"=>"0", "chance"=>"1", "already"=>"0", "again"=>"4"}