2017-01-05 3 views
-1

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

arr = [ 
    nil, 
    6, 
    "17 to 23 ||'.'||24 to 25 (add a decimal at 10th place)", 
    nil, 
    nil, 
    "37 to 51 ||'.'||52 to 53 (add a decimal at 100th place)", 
    nil 
] 

Я хочу, чтобы преобразовать этот массив в следующем:

arr = [ 
    nil, 
    6, 
    "10th", 
    nil, 
    nil, 
    "100th", 
    nil 
] 

т.е. из строки "17 to 23 ||'.'||24 to 25 (add a decimal at 10th place)", мне нужны цифры, указанные в скобке.

Я попытался следующий код, но он не работает:

arr.map! {|e| e[/^.*?add.*?(\d+)th.*?$/]} 
+0

ли вы только должны соответствовать '... th'? Как насчет '... 2nd' и' ... 3rd'? – Stefan

+0

Я хочу совместить 'th' только –

ответ

5

Ваш код не потому, что obj[pattern] работает только для строк, а не для nil или целых (есть Integer#[] но он делает что-то еще):

nil[/foo/] #=> NoMethodError: undefined method `[]' for nil:NilClass 
123[/foo/] #=> TypeError: no implicit conversion of Regexp into Integer 

Вместо этого вы можете использовать =~, который определен на Object и переопределен подклассами, например String:

arr.map {|e| e =~ /(\d+th)/ ? $1 : e } 
#=> [nil, 6, "10th", nil, nil, "100th", nil] 

Если e матчи /(\d+th)/, возвращающие $1 (первая группа захвата), в противном случае сама e.

Вы также можете использовать более конкретную картину:

/add a decimal at (\d+th) place/ 
Смежные вопросы