Ruby修改数组项并返回完整数组

时间:2015-11-06 18:31:11

标签: arrays ruby

我这里有这段代码

string.split(/(\w{1,}=)/).each_slice(1).map { |i| items << i }

items.map! do |i|
    i = i << str if i.to_s =~ /\w{1,}=/
end

puts items*''

我想基于正则表达式修改数组中的某些项,然后返回包含修改项的完整数组。这仅返回修改的项目。我如何实现我的目标?

编辑:好的,所以说我正在尝试使用此正则表达式分割链接:

  

page.php文件站点=嗒嗒&安培;?ID = 1

链接被拆分并添加到现在包含

的数组中
  

page.php文件?

     

站点=

     

嗒嗒&安培;

     

ID =

     

1

我想要做的是将一些值附加到以a结尾的元素的末尾。这样,当我将修改后的数组作为字符串返回时,它将输出如下:

  ?

page.php文件站点=(的newval)和ID =(的newval)

2 个答案:

答案 0 :(得分:1)

您的示例中有几个未定义的变量,这非常草率。

  1. each_slice(1)相当于each(),因此不清楚您使用each_slice(1)的原因。在任何情况下,each()map()都逐个遍历数组中的项,但每个()返回原始数组不变。另一方面,当您要创建包含项目更改的新数组时,可以使用map()

  2. 在正则表达式/\w{1,}/中,量词{1, }有一个快捷方式,它是+,因此大多数人都会将正则表达式写为{ {1}},其中/\w+/表示+

  3.   

    我想基于正则表达式修改数组中的某些项目   返回包含修改过的项目的完整数组。

  4. 以下是一个例子:

    1 or more

    如果条件失败,您当前使用results = [1, 2, 3].map do |num| if num == 2 num + 4 else num - 1 end end p results --output:-- [0, 6, 2] 的尝试不会返回任何内容。请注意上面的示例如何在条件失败和条件成功时返回某些内容。 map()将项目替换为该项目返回的任何内容。

    现在看看这个例子:

    map()

    如果您没有为某件商品退货,则results = [1, 2, 3].map do |num| if num == 2 num + 4 end end p results --output:-- [nil, 6, nil] 会对该商品使用map()。在示例中,如果条件nil为真,则返回num == 2 - 但如果num+4为false,则不返回任何内容。

    修改

    num == 2

答案 1 :(得分:0)

您是否考虑过使用addressable gem?而不是使用正则表达式解析网址?

require 'addressable/uri'

uri = Addressable::URI.parse('page.php?site=blah&id=1&bar')
uri.query_values = uri.query_values.map do |k, v| 
  [k, v.is_a?(String) ? v << 'foo' : v] 
end
puts uri.to_s # => page.php?site=blahfoo&id=1foo&bar

这不会处理非常复杂的查询参数(它只会传递它们)。

您可以使用respond_to? :sub!v.sub! /$/, 'foo'代替检查类型,如果这让您感到不安。 (我不会使用:<<:concat因为这些是有效的数组方法。)