我有一个IP地址,像这样“127.000.000.001”,我该如何去掉前导零,以获得这个“127.0.0.1”?
目前我使用的正则表达式是:
Regex.Replace("127.000.000.001", "0*([0-9]+)", "${1}")
有没有其他方法可以在不使用正则表达式的情况下实现此结果?
我在这段代码中使用了Visual C# 3.0。
Regex.Replace("127.000.000.001", "0*([0-9]+)", "${1}")
有没有其他方法可以在不使用正则表达式的情况下实现此结果?
我在这段代码中使用了Visual C# 3.0。
IP地址对象将把前导零视为八进制数,因此不应使用它来去除前导零,因为它无法处理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地址的情况。
不需要正则表达式来做这件事,你可以像这样做。
IPAddress IP = IPAddress.Parse("127.000.000.001");
IP.ToString()
你可以使用以下用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;
}
IPAddress.Parse
方法中有一个错误吗?这是你的意思吗?你向微软提交了错误报告吗?当你使用构造函数时会发生什么?你看到相同的行为吗? - Cody Gray