gpt4 book ai didi

ruby - 用于验证长而复杂的 dns 目标的正则表达式

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:05 26 4
gpt4 key购买 nike

我尝试验证的 DNS 条目很长。以下是该结构的示例:

qwer-0123a4bcd567890e1-uuuuu3xx.qwer-gfd-1e098765dcb4a3210.ps-sdlk-6.qwer.domain.com

这些条目可以被认为是三个不同的部分:

  1. qwer-0123a4bcd567890e1-uuuuu3xx.qwer-gfd-1e098765dcb4a3210。

    • 始终以 qwer- 开头
    • 后跟 17 个字母数字,一个 -,还有 8 个字母数字
    • 紧随其后的是 qwer-gfd-
    • 后跟 17 个字母数字和一个
  2. ps-sdlk-6

    • 始终以 ps-sdlk- 开头
    • 后跟一个或两个字母数字。在这种情况下,它可能是 ps-sdlk-6 或类似 ps-sdlk-6e
    • 的东西
  3. .qwer.domain.com

    • 域目标始终以 .qwer.domain.com 结尾

我一直在拼凑一个正则表达式并想出了这个怪物:

qwer-[\w]{17}-[\w]{8}.qwer-gfd-[\w]{17}.(.*)(qwer.domain.com)

该解决方案非常可怕,它会返回多个匹配组,这让我对准确性没有太大信心。我正在使用 ruby​​ 2.5,但在这种情况下很难导入非标准库的东西。

是否有更明智和完整/准确的正则表达式来确认这些 dns 目标的有效性?如果没有正则表达式,有没有更好的方法来做到这一点?

最佳答案

考虑到测试较长的正则表达式的复杂性,以及将来需要更改的可能性(如果不是概率的话),我倾向于将字符串拆分为连字符并测试结果数组中的每个字符串.

PIECES = [['qwer'],
['0123a4bcd567890e1'.size],
['uuuuu3xx'.size, '.qwer'],
['gfd'],
['1e098765dcb4a3210'.size, '.ps'],
['sdlk'],
[[1, 2], '.qwer.domain.com']].
map do |a|
Regexp.new(
a.each_with_object('\A') do |o,s|
case o
when String
s << o.gsub('.', '\.')
when Integer
s << "\\p{Alnum}{#{o}}"
else # array
s << "\\p{Alnum}{#{o.first},#{o.last}}"
end
end << '\z')
end
#=> [/\Aqwer\z/, /\A\p{Alnum}{17}\z/, /\A\p{Alnum}{8}\.qwer\z/,
# /\Agfd\z/, /\A\p{Alnum}{17}\.ps\z/, /\Asdlk\z/,
# /\A\p{Alnum}{1,2}\.qwer\.domain\.com\z/]

请注意,我在大多数地方都使用了单引号,例如,'\A' 而不是 "\\A"。但是,执行插值的两行 (#{o}) 需要双引号。我还使用了示例中的字符串来确定各种字母数字字符的长度,并在简单代码中转义了句点并添加了 anchor 。我这样做是为了减少计算错误的机会,并帮助代码的读者理解正在做什么。虽然这里使用 PIECES 的元素(正则表达式)来测试用于构造 PIECES 的字符串,但这当然是无关紧要的,因为我们必须假设所有字符串要测试的将具有相同的模式。

def valid?(str)
arr = str.split('-')
return false unless arr.size == PIECES.size
arr.zip(PIECES).all? { |s,r| s.match? r }
end

如果Enumerable#all?的 block 返回 false all? 立即返回 false。这有时被称为短路行为。

对于例子中给出的字符串,str,

valid?(str)
#=> true

注意下面的中间计算。

str.split('-').zip(PIECES)
#=> [["qwer", /\Aqwer\z/],
# ["0123a4bcd567890e1", /\A\p{Alnum}{17}\z/],
# ["uuuuu3xx.qwer", /\A\p{Alnum}{8}\.qwer\z/],
# ["gfd", /\Agfd\z/],
# ["1e098765dcb4a3210.ps", /\A\p{Alnum}{17}\.ps\z/],
# ["sdlk", /\Asdlk\z/],
# ["6.qwer.domain.com", /\A\p{Alnum}{1,2}\.qwer\.domain\.com\z/]]

这可能看起来有些矫枉过正(我不确定是否如此),但它确实有助于调试和测试,如果将来字符串模式发生变化(在限制范围内),修改匹配应该相对容易测试(通过更改上面派生 PIECES 的数组)。

关于ruby - 用于验证长而复杂的 dns 目标的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53625394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com