我有一个数组如下:
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 :(得分:6)
您的代码失败,因为obj[pattern]
仅适用于字符串而不适用于nil
或整数(有Integer#[]
但它还有其他功能):
nil[/foo/] #=> NoMethodError: undefined method `[]' for nil:NilClass
123[/foo/] #=> TypeError: no implicit conversion of Regexp into Integer
您可以使用=~
而不是Object
定义的arr.map {|e| e =~ /(\d+th)/ ? $1 : e }
#=> [nil, 6, "10th", nil, nil, "100th", nil]
并由子类覆盖,例如String
:
e
如果/(\d+th)/
与e
匹配,请返回$1
(第一个捕获组),否则返回/add a decimal at (\d+th) place/
。
您还可以使用更具体的模式:
div#cost
p You earn #{cost} a day!