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

7
我有一个IP地址,像这样“127.000.000.001”,我该如何去掉前导零,以获得这个“127.0.0.1”? 目前我使用的正则表达式是:
Regex.Replace("127.000.000.001", "0*([0-9]+)", "${1}")

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

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

5个回答

14

10

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

相反地,试试使用System.Net.IpAddress

该类提供了一个ToString()方法,它将以标准表示法返回IP地址的可读版本。这可能是你想要的。


5
我对Brent的回答感到担忧。我遇到了IPAddress.Parse的问题,前导零被解释为八进制。那么ToString如何帮助呢?因为它首先需要一个IPAddress,而要从字符串中创建一个IPAddress,你需要先进行Parse。不幸的是,这个答案在这一点上失败了。 - v.oddou
1
如果IP = 172.016.000.000,这将是错误的。调用IPAddress.Parse(IP)后,结果将为172.14.0.0。这是不正确的。我们应该删除IP地址的前导0。 - NoName
那么,@Phuc,IPAddress.Parse方法中有一个错误吗?这是你的意思吗?你向微软提交了错误报告吗?当你使用构造函数时会发生什么?你看到相同的行为吗? - Cody Gray
这被视为八进制。如果我没记错的话,我也在构造函数中看到了这个。IpAddress 真的需要一个 ParseExact。请参见下面的答案。 - scottheckel
1
@CodyGray,我认为在使用IPAddress.Parse()之前,我们应该从ip地址字符串中删除前导零。然后,IPAddress.Parse()返回的结果将始终是正确的。 - NoName

2

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

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

它将返回10.1.100.1。这仅适用于整个文本是IP地址的情况。


2
有没有其他方法可以在不使用正则表达式的情况下实现这个结果?你并没有尝试解决提问者的问题。事实上,你回答了他们当前如何解决问题的方式。他们要求提供一种替代方案。 - Timothy Zorn

0

不需要正则表达式来做这件事,你可以像这样做。

IPAddress IP = IPAddress.Parse("127.000.000.001");
IP.ToString()

-2

你可以使用以下用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;
}

2
该标签明确指出是C#,但这是一段C代码。至少将其转换为C#,使其成为一个答案。 - Martheen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接