#ruby
#ruby
Вопрос:
Предполагается, что моя программа отслеживает каждый ip-адрес и сопоставляет их со случайным, затем переходит к gsub всех IP-адресов с рандомами. Однако мой 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(/(bd{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-адрес с правильным случайным.
Ответ №1:
Это намного проще, если вы используете хэш со значением по умолчанию:
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 = /bd{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"}