gsub哈希键必须是字符串,而不是正则表达式吗?

时间:2011-03-15 20:42:39

标签: ruby regex

我想针对一个字符串执行gsub s序列,因此我利用了gsub可以将哈希作为第二个参数的事实。我想用gsub做的一件事是将一个或多个空格/制表符的序列转换为单个空格,所以我的基本内容如下:

gsub(/[ \t]+/, {/[ \t]+/ => ' '})

在我的实际代码中,第一个参数是我在这里给出的正则表达式的联合,第二个参数包含更多的键值对。

现在,当我将其应用于字符串时,将删除所有空格/制表符。我想这是因为第一个参数的匹配不被认为与第二个参数(哈希)中的键[ \t]匹配。第二个参数hash中的匹配是否仅查找精确的字符串匹配,而不是regexp匹配?如果是这样,有没有办法解决它?

3 个答案:

答案 0 :(得分:1)

这是一个相关的question。如果您需要使用哈希,因为必须替换许多内容,这可能有效:

list = Hash.new{|h,k|if  /\s+/ =~ k then ' ' else k end}
list['foo'] = 'bar'
list['apple'] = 'banana'

p "appleabc\t  \tabc  apple foo".gsub(/\w+|\W+/,list)
#=> "appleabc abc banana bar"
p list
#=>{"foo"=>"bar", "apple"=>"banana"} no garbage

答案 1 :(得分:1)

根据文档,使用散列作为第二个参数的gsub仅匹配文字字符串:

'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*')    #=> "h3ll*"

如果要提供多个哈希,可以通过创建哈希来解决它,其中键/值对是search =>替换对,迭代哈希,并将它们传递给gsub。因为Ruby 1.9+维护了哈希的插入顺序,所以保证搜索将按照你想要的顺序进行。

search_hash = {
  '1' => 'one', 
  'too' => 'two', 
  /[\t ]+/ => ' '
}
str = "1, too,\t3 ,    four"
search_hash.each { |n,v| str.gsub!(n, v) }
str #=> "one, two, 3 , four"

答案 2 :(得分:0)

如果您只想将空格/标签替换为一个空格,为什么不将其指定为替换,并省略整个哈希?

gsub(/[ \t]+/, ' ')

更新:根据您的评论,您可以使用gsub

的块语法
gsub(/[ \t]+/) {|match| *do stuff here* }