2011-09-02 41 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]}版本也不会真正起作用(除非数字保证只有一个数字)。 –