带有正则表达式

时间:2017-01-05 10:29:32

标签: arrays ruby

我有一个数组如下:

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.*?$/]}

1 个答案:

答案 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!