使用 C# 从 IP 地址中删除前导零

Posted

技术标签:

【中文标题】使用 C# 从 IP 地址中删除前导零【英文标题】:Remove leading zeros from IP Address with C# 【发布时间】:2012-04-14 18:01:48 【问题描述】:

我有一个像“127.000.000.001”这样的 IP 如何删除前导零以获得这个“127.0.0.1”? 现在我像这样使用正则表达式

Regex.Replace("127.000.000.001", "0*([0-9]+)", "$1")

有没有其他方法可以在不使用正则表达式的情况下实现此结果?

我在这段代码中使用了 Visual C# 3.0

【问题讨论】:

【参考方案1】:

您可以在 C 中使用以下逻辑编写。

#include<stdio.h>
#include<string.h>
#include <arpa/inet.h>

int main(int argc, char** argv)

    int inlen=strlen(argv[1])+1, cnt=0, dstcnt=0;
    char dststr[INET_ADDRSTRLEN]="";

    if(argc<2)
    
        printf("usage: ipvalidator [ip]\n");
        return 0;
    

    for(cnt=0; cnt<inlen; cnt++)
    
        if(argv[1][cnt]=='\0')
        
            break;
        
        
        if( (argv[1][cnt]=='0') && (argv[1][cnt+1] == '0') &&
            ((cnt==0) ||(argv[1][cnt-1] == '.') || (argv[1][cnt-1] == '0')) )
        
            continue;
        
        
        if( (argv[1][cnt]=='0') && (argv[1][cnt+1] >= '1') && 
            (argv[1][cnt+1] <= '9') && 
            ((cnt==0) || (argv[1][cnt-1] == '.') || (argv[1][cnt-1] == '0')) )
        
            continue;
        

        dststr[dstcnt++] = argv[1][cnt];

    
    dststr[dstcnt++] = '\0';

    printf("New IP String: %s\n",dststr);
    return dstcnt;

【讨论】:

标签特别写着 C#,但这是一个 C 代码。至少将其转换为 C# 以使其成为答案【参考方案2】:

正如@Brent 所说,IPAddress.TryParse 将前导零视为八进制,这将导致错误的答案。解决此问题的一种方法是使用RegEx.Replace 进行替换。我个人喜欢这个寻找一个 0 后跟任意数量的数字。

Regex.Replace("010.001.100.001", "0*([0-9]+)", "$1")

它将返回10.1.100.1。这仅在整个文本是 IP 地址时才有效。

【讨论】:

"有没有其他方法可以在不使用正则表达式的情况下达到这个结果?"您没有尝试解决提问者的问题。事实上,您已经回答了他们目前如何解决问题。他们要求另一种选择。【参考方案3】:

IP 地址对象会将前导零视为八进制,因此不应使用它来删除前导零,因为它不会处理 192.168.090.009。

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/21510004-b719-410e-bbc5-a022c40a8369

【讨论】:

【参考方案4】:

是的,有一个比使用正则表达式更好的方法。

请尝试System.Net.IpAddress class。

ToString() method 将以其标准表示法返回 IP 地址的人类可读版本。这可能就是你想要的。

【讨论】:

我担心布伦特的回答。我有 IPAddress.Parse 的问题。前导零解释为八进制。那么 ToString 将如何提供帮助,因为它首先需要一个 IPAddress 并且要从一个需要先解析的字符串中创建一个。不幸的是,这就是这个答案失败的地方。 如果 IP = 172.016.000.000,这将是错误的。调用 IPAddress.Parse(IP) 后,结果为 172.14.0.0。这是不正确的。我们应该删除IP地址的前导0。 那么@PhucIPAddress.Parse方法中有一个bug?这就是你说的吗?您是否向 Microsoft 提交了错误报告?当您使用the constructor 时会发生什么?你看到同样的行为吗? 这被视为八进制。如果我没记错的话,我也用构造函数看到了这个。 IpAddress 确实需要 ParseExact。请参阅下面的答案。 @CodyGray,我认为在我们使用 IPAddress.Parse() 之前,我们应该删除 ipaddress 字符串中的前导零。然后,IPAddress.Parse() 返回的结果总是正确的。

以上是关于使用 C# 从 IP 地址中删除前导零的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 从字符串中删除前导零?

从输入 type=number 中删除前导零

从android中的自定义零按钮中删除edittext中的前导零

从 QString 中删除前导零的最佳方法

将 int 存储到 SQL,但保持前导零

使用 to_char 函数解析为字符串时,如何从 Oracle 中的日期和月份值中删除前导零?