regex IP(v4)地址的正则表达式

yftpprvb  于 2022-12-14  发布在  其他
关注(0)|答案(5)|浏览(171)

我正在尝试使用regex从一个HTML页面的IP地址:

<html>
  <head><title>Current IP Check</title></head>
  <body>Current IP Address: xx.xxx.xxx.xx</body>
</html>

我的VB.Net代码现在是这样的:

Using wClient As New WebClient
   ip = wClient.DownloadString("http://checkip.dyndns.org/")
   ip = Regex.Match(ip, "^[+-]?(\d+(\.\d+)?|\.\d+)$", RegexOptions.Singleline).ToString
End Using

然而,最终的结果对IP来说却毫无意义。
我只是想得到xx.xxx.xxx.xx
我做错了什么?

bz4sfanl

bz4sfanl1#

IP地址的正则表达式比你描述的要复杂得多。但是没有理由重新发明轮子。请看一下Regular Expression Examples,这里是解释一切的一个:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
lzfw57am

lzfw57am2#

vb.net版本

这适用于使用CIDR表示法的ipv4 {示例10.10.10.10/30},并假定原始数据中有一个有效的IP。
它将使用MatchCollection检查整个文本中的所有匹配项,而不仅仅是单个示例的Match。
如果您只需要字符串中的第一个示例,则使用Match而不是MatchCollection,这样您将只获得第一个示例。
在这种情况下,我输入一些值并将它们作为列表传递,然后使用foreach循环迭代每个字符串
如果您需要确保IP有效,请使用前面答案中的另一个正则表达式,因为它在每个八位字节上的取值范围仅为1到255。
如果你知道你将有有效的IP,你试图用regex从一批原始数据中分离出来,这就更简单了。
我使用该窗体类中的公共属性将筛选后的文本框的值传递回调用模态窗体,然后在调用窗体中引用该公共属性

Public Property ReturnCommands As String = ""

    Private Sub FORM_AddStaticIPsToSR2BNG_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ReturnCommands = ""
End Sub

Private Sub BTN_FilterData_Click(sender As Object, e As EventArgs) Handles BTN_FilterData.Click
    Dim s As String = TBX_RawData.Text
    Dim matches As MatchCollection = Regex.Matches(s,"\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}[/]\d{1,2}")
    For Each m As Match In matches
        TBX_SR2StaticIPCommands.AppendText("prefix " & m.Value & " type longer" & vbCrLf)
    Next
End Sub

'如果您知道它是有效的IPv4并且没有CIDR表示法,则可以将正则表达式模式更改为“\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}”

jucafojl

jucafojl3#

IPv4没有+或-符号,如果您没有其他类似字符串模式的危险,实际上可以更简单地执行此操作

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

此外,如果您需要查找IPv6地址,则可以尝试类似于

\b(?:[\dA-F]{1,4}:){1,7}(?:(?::[\dA-F]{1,4}){1,6}|(?:::[\dA-F]{1,4}){1,7}|:|[\dA-F]{1,4})?\b

请注意,这两种方法都可以找到“候选者”,不应该用于验证。如果您想使用RegEx验证IPv6,请查看here

t30tvxxf

t30tvxxf4#

对于这样简单的html,您可以只使用strings.split:

Dim source As String = wClient.DownloadString("http://checkip.dyndns.org/")
Dim ip As String = Split(Split(source, "Current IP Address:")(1), "</body>")(0).Trim()
flvtvl50

flvtvl505#

由于@Neolisk的答案在大多数情况下都是有效的,我将其编辑为接受带前导零的数字:

\b(0*(25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(0*(25[0-5]|2[0-4]\d|[01]?\d\d?))\b

接受某些IP,如000010.10.10.000001

相关问题