首页 > 解决方案 > Ruby gsub 在 IP 地址上重复

问题描述

我的程序假设跟踪每个 ip 地址并将它们映射到一个随机地址,然后继续使用随机数对所有 ip 进行 gsub。然而,我的 gsub 正在那里没有完全有 IP 地址的地方工作(它附加到带有一堆数字的 url 的后面,它在数字前面附加了 IP 地址)或者它确实替换了一个ip地址,它会多次替换它。

v 是一个随机字符串,例如"https://10.110.0.100/html/1202234"

当它运行时,变成

https://227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95/html/227.95.94.952227.95.94.952234
ipsRand = Hash[]
ips = v.scan(/(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b)/)
ips.each { |x|
if ips.length > 0
    ips.each { |x|
        if !ipsRand.key?(x)
            ip = "%d.%d.%d.%d" % [rand(256), rand(256), rand(256), rand(256)]
            ipsRand["#{x}"] = ip
            v.gsub!(/#{x}/, ip) 
        else
            v.gsub!(/#{x}/, ipsRand["#{x}"])
        end 
    }
end

不完全确定在这里做什么,当我/#{x}与用于扫描 IP 地址的正则表达式交换时,gsub 工作得很好,但是我无法将每个 IP 地址映射到正确的随机地址。

标签: ruby

解决方案


如果您使用具有默认值的散列会容易得多:

ips_rand = Hash.new do |h, k|
  h[k] = '%d.%d.%d.%d' % [rand(256), rand(256), rand(256), rand(256)]
end

该哈希将在每次调用时创建一个新的随机 IP(使用未知 IP)并在之后重新使用它(使用已知 IP 调用时)。

此外,它可以直接传递给gsub

PATTERN = /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/

a = 'https://10.110.0.100/foo/bar'
b = 'https://10.110.0.100/baz/qux'
c = 'https://20.220.0.200/quux'

a.gsub(PATTERN, ips_rand) #=> "https://213.19.202.167/foo/bar"
b.gsub(PATTERN, ips_rand) #=> "https://213.19.202.167/baz/qux"
c.gsub(PATTERN, ips_rand) #=> "https://26.21.120.130/quux"
ips_rand
#=> {"10.110.0.100"=>"213.19.202.167", "20.220.0.200"=>"26.21.120.130"}

推荐阅读