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

本文关键字:删除 地址 IP 使用 | 更新日期: 2023-09-27 18:29:31

我有一个类似"127.0.000.001"的IP,如何删除前导零以获得"127.0.0.1"?现在我使用类似的正则表达式

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

有没有其他方法可以在不使用regex的情况下实现此结果?

我使用可视化C#3.0来编写这个代码

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

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

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

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

相反,请尝试System.Net.IpAddress类。

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

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

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

它将返回10.1.100.1。只有当整个文本是一个IP地址时,这才会起作用。

不需要regex,您可以这样做。

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

您可以在C.中使用以下逻辑writien

#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;
}