我这里有这段代码
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)
答案 0 :(得分:1)
您的示例中有几个未定义的变量,这非常草率。
each_slice(1)
相当于each()
,因此不清楚您使用each_slice(1)
的原因。在任何情况下,each()
和map()
都逐个遍历数组中的项,但每个()返回原始数组不变。另一方面,当您要创建包含项目更改的新数组时,可以使用map()
。
在正则表达式/\w{1,}/
中,量词{1, }
有一个快捷方式,它是+
,因此大多数人都会将正则表达式写为{ {1}},其中/\w+/
表示+
。
我想基于正则表达式修改数组中的某些项目 返回包含修改过的项目的完整数组。
以下是一个例子:
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
因为这些是有效的数组方法。)