从字符串中匹配 url 路径和 ip 地址

Posted

技术标签:

【中文标题】从字符串中匹配 url 路径和 ip 地址【英文标题】:Match url path and ip address from string 【发布时间】: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,您可以不使用模式匹配,而只需在分隔两者的空间上拆分。 【参考方案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::new 和IPAddr#ipv4?。 & 是 Ruby 的 Safe Navigation Operator。

【讨论】:

以上是关于从字符串中匹配 url 路径和 ip 地址的主要内容,如果未能解决你的问题,请参考以下文章

Java:怎样使用正则从url中匹配出ip和端口呢

php正则匹配图片路径

Groovy如何获取访问地址

nginx之location介绍

从输入 URL 到页面展示,到底发生了什么

Nginx的location匹配规则-根据url 路径重定向到不同的IP