¿Cómo hacer coincidir dos partes de la cuerda?
Cadena de ejemplo:
/some/page_path 255.122.212.211La primera parte que quiero hacer coincidir es una ruta válida, una simple verificación si comienza con / y sin espacios en blanco. (¿y tal vez signos especiales?)
La segunda parte es solo verificar la dirección IP si tiene un patrón de (0-9) números con puntos.
Ejemplo de cadena mala:
/some/page _path 2525.122.212 yada yadaRegex que tengo para IP:
^(?:[0-9]{1,3}\.){3}[0-9]{1,3}Puedes usar
/\A(?:\/[^\/\s]+)+\s+(?:[0-9]{1,3}\.){3}[0-9]{1,3}\z/Vea la demostración de Rubular . Detalles :
\A - comienzo de la cadena(?:\/[^\/\s]+)+ - una o más apariciones de / y luego uno o más caracteres que no sean / y espacios en blanco\s+ - uno o más caracteres de espacio en blanco(?:[0-9]{1,3}\.){3}[0-9]{1,3} : tres apariciones de uno a tres dígitos seguidas de un . char, y luego de uno a tres dígitos\z - final de la cadena.Supuse que la última parte de la cadena debe ser una dirección IPv4 válida.
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 La expresión regular que he usado en path_valid? se toma de la primera parte de la expresión dada por @Wiktor. Por supuesto, se podría utilizar una comprobación específica del sistema operativo más definitiva. Vea el documento para la gema ipaddress . Tenga en cuenta que he usado el segundo argumento opcional de 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)Una alternativa al uso de la gema ipaddress sería escribir:
def ip_valid?(ip_str) (IPAddr.new(ip_str) rescue nil)&.ipv4? end Ver IPAddr::new y IPAddr#ipv4? . & es el Operador de Navegación Segura de Ruby.