ruby - 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 地址映射到正确的随机地址。
解决方案
如果您使用具有默认值的散列会容易得多:
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"}
推荐阅读
- javascript - Vue 警告 data() 应该返回一个对象
- python - 安装 Anaconda Navigator 无法识别的 python 包的好方法
- python - ubuntu libux中的Python pip安装问题
- excel - Excel ActiveX 组合框不显示选择
- jquery - 如何在 react js 中安装 tailwindcss
- python - 如何将输入密码(api)与 django 管理员密码匹配?
- python-3.x - 如何在单行中写入整个字符串
- postgresql - PostgreSQL - 如何改进这个查询/索引
- php - Wordpress 如何禁用自定义帖子类型的子页面
- image - Flutter - 将 ImageProvider 保存到文件