从字符串中匹配 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 地址的主要内容,如果未能解决你的问题,请参考以下文章