我假设字符串的最后一部分必须是有效的 IPv4 地址。
require "ipaddress"
def str_parts(str)
path, ip_str = str.split(/ +/,2)
raise "'#{path}' is an invalid path" unless path_valid?(path)
raise "'#{ip_str}' is an invalid ip address" unless ip_valid?(ip_str)
[path, ip_str]
end
def path_valid?(path)
path.match?(/\A(?:\/[^\/\s]+)+\z/)
end
def ip_valid?(ip_str)
IPAddress.valid?(ip_str)
end
我在path_valid? 中使用的正则表达式取自@Wiktor 给出的表达式的第一部分。当然可以使用更明确的操作系统特定检查。 ipaddress gem 参见doc。请注意,我使用了String#split 的可选第二个参数。
str_parts("/some/page_path 255.122.212.211")
#=> ["/some/page_path", "255.122.212.211"]
str_parts("/some/page _path 2525.122.212 yada Yoda")
#=> RuntimeError ('_path 2525.122.212 yada Yoda' is an invalid ip address)
str_parts("/some/page_path 255.122.256.211")
#=> RuntimeError ('255.122.256.211' is an invalid ip address)
str_parts("/some//page_path 255.122.212.211")
#=> RuntimeError ('/some//page_path' is an invalid path)
使用 ipaddress gem 的替代方法是编写:
def ip_valid?(ip_str)
(IPAddr.new(ip_str) rescue nil)&.ipv4?
end
见IPAddr::new 和IPAddr#ipv4?。 & 是 Ruby 的 Safe Navigation Operator。