从字符串中剥离 IPv6 和端口号

Posted

技术标签:

【中文标题】从字符串中剥离 IPv6 和端口号【英文标题】:Stripping IPv6 and port number from a string 【发布时间】:2019-04-08 16:29:24 【问题描述】:

我有一个正则表达式来检查字符串是否包含 IP 地址。

我有没有检查并删除任何端口号/ipv6 详细信息 - 所以我只剩下 IP 地址:

117.89.65.117.ipv6.la 应该变成 117.89.65.117121.58.242.206:449 应该变成 121.58.242.206

这是我目前想出的代码来检查 - 谁能帮我修改它以去除上面的额外信息?

private void AddToList(String IP)

    Regex ipAddress = new Regex(@"\b\d1,3\.\d1,3\.\d1,3\.\d1,3\b");
    Match result = ipAddress.Match(IP);
    if (chkQuotes.Checked) IP = "\"" + IP + "\"";
    if (result.Success)
        if (cIPlist.IndexOf(IP) <= 0)
            cIPlist.Add(IP);

【问题讨论】:

你的输入是什么样的?像 117.89.65.117.ipv6.la121.58.242.206:449 一样作为整个字符串? 看来你可以使用if (chkQuotes.Checked) IP = $"\"result.Value\"";。但是在检查if (result.Success)之后再做。 检查ideone.com/gmC8uL 如果你添加 parentesis 你可以访问第 1 组中想要的信息 @DragandDrop 为什么要在这里添加捕获组?我认为 OP 只需要通过访问 result.Value 来获得整场比赛 【参考方案1】:

您可以使用result.Value 访问整个匹配值,而不是重复使用IP 变量。

此外,在方法中使用正则表达式之前定义正则表达式以加快速度是一个好主意。

private static HashSet<string> cIPlist = new HashSet<string>();
private static readonly Regex ipAddress = new Regex(@"\b\d1,3\.\d1,3\.\d1,3\.\d1,3\b");

private void AddToList(String IP)

    var result = ipAddress.Match(IP);
    if (result.Success)                 # Check if there is a match
    
        if (chkQuotes.Checked)          # If the checkbox is checked
        
            IP = $"\"result.Value\""; # Add quotes around the match value
        
        cIPlist.Add(IP);                # Add to hashset of strings
    

请参阅C# demo。

请注意,如果您想将正则表达式模式限制为仅匹配 IP 而不是像 999.999.999.999 这样的字符串,您可以使用来自 regular-expressions.info 的众所周知的模式:

new Regex(@"\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]?))3\b")

【讨论】:

【参考方案2】:

首先我们可以使用https://www.regular-expressions.info/ip.html 修复正则表达式并减少一点。与()3

然后要消除重复,您可以使用不允许它们的HashSet&lt;string&gt;

为了添加“简单”的一行 linQ 并进行测试,我将 AddToList 参数切换为 params string[]

static HashSet<string> resultingList = new HashSet<string>();
static string pattern = @"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)3(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]";
static Regex ipRegex = new Regex(pattern);

static void AddToList(params string[] ips) =>
    resultingList.UnionWith(
        ips.Select(x => ipRegex.Match(x))
            .Where(x => x.Success)
            .Select(x => x.Value)
    );

private static void TestMethod()

    var inputs = new[]
        "123.123.123.13:256",
        "123.123.123.13:256", //duplicate line
        "17.89.65.117.ipv6.la ",
        "21.58.242.206:449",
        "666.666.666.666"
    ;

    AddToList(inputs);
    AddToList("127.0.0.1");

【讨论】:

以上是关于从字符串中剥离 IPv6 和端口号的主要内容,如果未能解决你的问题,请参考以下文章

Java网络编程:IP地址和端口号

网络编程实验1udp实现CS和端口号

DNS域名解析协议详解

Python-TCP网络编程基础以及客户端程序开发

java中怎么获取客户端的真实的ip和端口号

ActionScript 3 AS3从字符串中剥离空格