header = "2600:1740:8540:cff9:1c50:617:c9c5:63f7, 165.154.107.112, 166.155.108.113"
header.split(/\s?,\s?/).find { |s| IPAddr.new(s).ipv4? }
#=> "165.154.107.112"
или
header.split(/,\s+/).select { |s| IPAddr.new(s).ipv4? }
#=> ["165.154.107.112", "166.155.108.113"]
См. IPAddr :: new и IPAddr # ipv4? .
Если "header = "
равночасть строки str
, замените header.split
на str[/\d.+/].split
.
Если строка может содержать текст, который не является допустимым IP-адресом, вы можете написать следующее.
header.split(/\s?,\s?/).find { |s| (IPAddr.new(s) rescue nil)&.ipv4? }
IPAddr.new('cat')
, например, поднимает исключение IPAddr::InvalidAddressError (invalid address)
.&
- оператор безопасной навигации Ruby , дебютировавший в v2.3.