【问题标题】:Match url path and ip address from string从字符串中匹配 url 路径和 ip 地址
【发布时间】:2021-11-24 04:08:35
【问题描述】:

如何匹配字符串的两部分?

示例字符串:

/some/page_path 255.122.212.211

我要匹配的第一部分是有效路径,简单检查是否以 / 开头且没有空格。 (也许还有特殊标志?)

第二部分只是检查 IP 地址是否有 (0-9) 个带点数字的模式。

错误字符串示例:

/some/page _path 2525.122.212 yada yada

我的 IP 正则表达式:

^(?:[0-9]{1,3}\.){3}[0-9]{1,3}

【问题讨论】:

  • 如果左边真的是一个URL,它不能有嵌入空间。因此,IMO,您可以不使用模式匹配,而只需在分隔两者的空间上拆分。

标签: regex ruby


【解决方案1】:

你可以使用

/\A(?:\/[^\/\s]+)+\s+(?:[0-9]{1,3}\.){3}[0-9]{1,3}\z/

请参阅Rubular demo详情

  • \A - 字符串开头
  • (?:\/[^\/\s]+)+ - 出现一个或多个 /,然后出现一个或多个除 / 和空格之外的字符
  • \s+ - 一个或多个空格字符
  • (?:[0-9]{1,3}\.){3}[0-9]{1,3} - 出现 3 次一到三位数字,后跟一个 . 字符,然后是一到三位数字
  • \z - 字符串结束。

【讨论】:

    【解决方案2】:

    我假设字符串的最后一部分必须是有效的 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::newIPAddr#ipv4?& 是 Ruby 的 Safe Navigation Operator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      相关资源
      最近更新 更多