2015-11-06 39 views
0

我這裏有這個代碼紅寶石修改數組項,並返回全陣列

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 =

我想要做的是一些價值附加到了=結束元素的結束。這樣,當我返回修改後的數組作爲字符串,將這樣的輸出:

page.php文件的網站=(的newval)& ID =(的newval)

+3

歡迎來到Stack Overflow。請提供一個示例輸入字符串和您的預期輸出。當您對代碼運行不正確的問題時,我們需要能夠複製您所看到的內容,並且我們需要能夠使用同一組數據。請參閱「[問]」。 –

+0

[在匹配子字符串模式後替換URL中的數字]的可能重複(http://stackoverflow.com/questions/33089533/replacing-number-in-url-after-matching-substring-pattern)。這個問題幾乎是相同的,在你的情況下,['URI' Answer](http://stackoverflow.com/a/33089828/1978251)是最好的方法。 – engineersmnky

+1

'items = string.split(/(\ w {1,} =)/)'並且沒有'.each_slice(1).map ...'silliness。 – steenslag

回答

1

你有幾個不確定的變量在你的例子中,這是非常草率的。

  1. each_slice(1)相當於each(),所以爲什麼要使用each_slice(1)目前尚不清楚。在任何情況下,each()map()都逐個遍歷數組中的項目,但each()將原樣返回原始數組。另一方面,當您想要創建一個包含項目更改的新數組時,您使用map()

  2. 在正則表達式/\w{1,}/,存在量詞{1, }一個快捷方式,它是:+,所以大多數人會寫正則表達式爲/\w+/,其中+意味着1 or more

  3. 我想修改某些項目基於正則表達式的數組中,然後 在它與修改的項目返回全陣列。

下面是一個例子:

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 - 但如果num == 2爲false,則不返回任何內容。

編輯:

words = %w[ 
    page.php? 
    site= 
    blah& 
    id= 
    1 
] #=> words = ["page.php?", "site=", "blah&", "id=", "1"] 

suffix = 'hello' 

results = words.map do |word| 
    if word.end_with?('=') 
    "#{word}#{suffix}" 
    else 
    word 
    end 
end 

p results 

--output:-- 
["page.php?", "site=hello", "blah&", "id=hello", "1"] 
+0

爲了清晰起見,我在OP中添加了進一步的解釋。 – user3674736

+0

@ user3674736,查看我的帖子底部的例子。 – 7stud

0

解析URL與正則表達式相反的,你有沒有考慮過使用addressable寶石?

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,因爲這些是數組的有效方法。)