Search code examples
vb.netvb.net-2010

Extract IP Addresses from JSON file using VB.net


is there a way to extract only IPv4 from a file in JSON language using VB.net

For example I would like that when I open a JSON file from VB I can filter only IPv4 from this text for example: https://pastebin.com/raw/S7Vnnxqa

& i expect the results like this https://pastebin.com/raw/8L8Ckrwi i founded this website that he offer a tool to do that https://www.toolsvoid.com/extract-ip-addresses/ i put the link here to understand more what i mean but i don't want to use an external tool i want it to be converted from VB directly thanks for your help in advance.


Solution

  • Your "text" is JSON. Load it using the JSON parser of your choice (google VB.NET parse JSON), loop over the matches array and read the IP address from the http.host property of each element.

    Here is an example how to do it using the Newtonsoft.Json package (see it working here on DotNetFiddle):

    ' Assume that the variable myJsonString contains the original string
    
    Dim myJObject = JObject.Parse(myJsonString)
    For Each match In myJObject("matches")
        Console.WriteLine(match("http")("host"))
    Next
    

    Output:

    62.176.84.198
    197.214.169.59
    46.234.76.75
    122.136.141.67
    219.73.94.83
    2402:800:621b:33f1:d1e3:5544:4fcf:526e
    178.136.75.125
    188.167.212.252
    ...
    

    If you want to extract only IPv4 and not IPv6, you can use a regular expression to check whether it matches:

    Dim IPV4Regex = New Regex("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
    
    Dim ip = match("http")("host")
    If IPV4Regex.Match(ip).Success Then
      Console.WriteLine(ip)
    End If
    
    62.176.84.198
    197.214.169.59
    46.234.76.75
    122.136.141.67
    219.73.94.83
    178.136.75.125
    188.167.212.252
    ...
    

    Of course it's always recommended to parse the input data in a structured way, to avoid surprises such as false positives. But if you just want to match anything that looks like an IP address, regardless of the input format (even if you just put hello1.2.3.4world in the textbox), then you could use just the regular expression and skip the structured approach (see it working here on DotNetFiddle):

    Dim IPV4RegexWithWordBoundary = New Regex("\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b")
    
    Dim match = IPV4RegexWithWordBoundary.Match(myJsonString)
    Do While match.Success
        Console.WriteLine(match.Value)
        match = match.NextMatch()
    Loop
    

    Here I modified the regular expression to use \b...\b instead of ^...$ so that it matches word boundaries instead of start/end of string. Note however that now we get IP addresses twice with the input that you provided, because the addresses exist more than once:

    62.176.84.198
    62.176.84.198
    197.214.169.59
    197.214.169.59
    46.234.76.75
    46.234.76.75
    ...