我想针对一个字符串执行gsub
s序列,因此我利用了gsub
可以将哈希作为第二个参数的事实。我想用gsub
做的一件事是将一个或多个空格/制表符的序列转换为单个空格,所以我的基本内容如下:
gsub(/[ \t]+/, {/[ \t]+/ => ' '})
在我的实际代码中,第一个参数是我在这里给出的正则表达式的联合,第二个参数包含更多的键值对。
现在,当我将其应用于字符串时,将删除所有空格/制表符。我想这是因为第一个参数的匹配不被认为与第二个参数(哈希)中的键[ \t]
匹配。第二个参数hash中的匹配是否仅查找精确的字符串匹配,而不是regexp匹配?如果是这样,有没有办法解决它?
答案 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* }