2011-09-02 78 views
3

我需要根據字符串上的正則表達式搜索替換db字段中的某些文本。正則表達式在Ruby on Rails中替換表達式

到目前爲止,我有這:

foo = my_string.gsub(/\[0-9\]/, "replacement" + array[#] + "text") 

所以,我搜索在現場由括號包圍的數的每個實例([1],[2],等等)。我想要做的是在搜索中查找每個數字(在括號內),並讓該數字用於查找特定數組節點。

任何想法?讓我知道是否有人需要任何澄清。

回答

8

最簡單的辦法是使用的gsub塊形式:

foo = my_string.gsub(/\[(\d+)\]/) { array[$1.to_i] } 

,並注意正則表達式中捕獲組。在塊內部,全球$1是第一個捕獲組匹配的內容。

你也可以使用一個名爲捕獲組但這需要一個不同的世界,因爲$~是(據我所知),只有這樣,才能獲得在塊內的電流MatchData對象:

foo = my_string.gsub(/\[(?<num>\d+)\]/) { |m| a[$~[:num].to_i] } 

例如:

>> s = 'Where [0] is [1] pancakes [2] house?' 
=> "Where [0] is [1] pancakes [2] house?" 
>> a = %w{a b c} 
=> ["a", "b", "c"] 

>> s.gsub(/\[(\d+)\]/) { a[$1.to_i] } 
=> "Where a is b pancakes c house?" 

>> s.gsub(/\[(?<num>\d+)\]/) { |m| a[$~[:num].to_i] } 
=> "Where a is b pancakes c house?" 
+0

非常感謝! :) – Brady

+1

命名的捕獲示例不起作用。 'm'是一個字符串,'m ['num']'不返回指定的捕獲。你可以使用's.gsub(/ \ [(? \ d +)\] /){a [$〜[:num] .to_i]} – Stefan

+1

@Stefan:哇,我怎麼錯過了。 'gsub(/ \ [(\ d +)\] /){| m |一個[m [1] .to_i]}版本也不會真正起作用(除非數字保證只有一個數字)。 –