【问题标题】:Regex match any IP not in internal range正则表达式匹配任何不在内部范围内的 IP
【发布时间】:2012-07-11 01:34:35
【问题描述】:

我目前正在编写一个 excel 宏,但我的具体要求遇到了一些真正的麻烦。

我需要遍历单元格并找到任何不在私有范围内的 IP 地址,

10.0.0.0 – 10.255.255.255
172.16.0.0 – 172.31.255.255
192.168.0.0 – 192.168.255.255

我正在使用的代码:

Dim RE As Object
Set RE = CreateObject("vbscript.regexp")

With RE
    .MultiLine = False
    .Global = False
    .IgnoreCase = True
    .Pattern = ??
End With

VBA 代码没有任何问题,只是模式而已。

真的很想请一位正则表达式大师来帮忙!

例如,单元格的格式如下:

192.168.1.1 (subnet name), 203.134.56.7 (third party unknown), 10.0.0.0/8 (voice subnet), 10.1.1.5 (voice server), 56.8.0.0/16 (google)

至于下面的评论,这就是为什么我正在寻找一个正则表达式解决方案(如果有的话),因为这意味着我可以在一个单元格上运行它,它仍然应该找到一个第三方 IP,而不是拆分成一个数组,并通过一个函数运行每个 ip。

【问题讨论】:

  • 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。
  • 您的确切数据布局是什么?更简单的方法可能是将 IP 地址提取到 4 列中,然后测试每个部分是否在范围内

标签: regex vba


【解决方案1】:

以下正则表达式代码应该可以帮助您。如果输入了有效的 IP 地址,它将匹配不在私有范围内的 IP 地址。但是,它不能确定 IP 地址是否有效(例如,它可能匹配 192.168.864.543。)可以对其进行更改以解决此问题,但由于正则表达式处理字符串而不是数字,因此更加困难。

10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172.([1][6-9]|[2][0-9]|[3][0-1])\.[0-9]{1,3}\.[0-9]{1,3}|192.168\.[0-9]{1,3}\.[0-9]{1,3}

也就是说,正如评论所建议的那样,正则表达式可能不是解决此问题的最佳方法。如果您想使用正则表达式,上面是一种可以使用它们的方法,但如上所述存在限制。

【讨论】:

  • 如果IP以十六进制形式表示当然不是一件坏事,如果以二进制形式表示则更好。
  • 但这仍然不包括 IPv6。 :-)
  • 据我所见,这似乎与私有 IP 匹配,因此如果未找到匹配项,我会知道该单元格具有外部 IP 地址。然而,我遇到的问题是单元中可能有多个 IP 地址。所以我真的需要强调只有当它有一个外部IP地址而不是上面提到的方法时。有人有更好的方法吗?
  • 你能举例说明每个单元格的格式吗?
  • 如何添加子网限制 x.x.x.x/xx
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多