判断一个字符串如果没有端口的话,利用ipAddress.TryParse很好判断,那么有端口怎么判断呢,正则表达式?还是其他方式?
关键代码:
/// <summary>/// 判断是否是合法的IP4,IP6地址/// </summary>/// <param name="ip">需要判断的字符串</param>/// <returns>合法则返回host部分,若不合法则返回空</returns>publicstaticstringGetIPAddress(stringip)
{string_ipAddress =string.Empty;if(!string.IsNullOrEmpty(ip))
{
UriHostNameType _hostType = Uri.CheckHostName(ip);if(_hostType == UriHostNameType.Unknown)//譬如 "192.168.1.1:8060"或者[2001:0DB8:02de::0e13]:9010{
Uri _url;if(Uri.TryCreate(string.Format("http://{0}", ip), UriKind.Absolute,out_url))
{
_ipAddress = IPAddressTryParse(_url.Host);
}
}elseif(_hostType == UriHostNameType.IPv4 || _hostType == UriHostNameType.IPv6)
{
_ipAddress = IPAddressTryParse(ip);
}
}return_ipAddress;
}PRivatestaticstringIPAddressTryParse(stringip)
{string_ipAddress =string.Empty;
IPAddress _ipAdr;if(IPAddress.TryParse(ip,out_ipAdr))
{
_ipAddress = _ipAdr.ToString();
}return_ipAddress;
}
单元测试:
[TestMethod()]publicvoidGetIPAddressTest()
{string_ip4Address1 ="192.168.1.1";string_expected1 ="192.168.1.1";string_actual1 = NetWorkToolV2.GetIPAddress(_ip4Address1);
Assert.AreEqual(_expected1, _actual1);string_ip4Address2 ="192.168.1.1:8060";string_expected2 ="192.168.1.1";string_actual2 = NetWorkToolV2.GetIPAddress(_ip4Address2);
Assert.AreEqual(_expected2, _actual2);string_ip6Address3 ="2001:0DB8:02de::0e13";string_expected3 ="2001:DB8:2de::e13";string_actual3 = NetWorkToolV2.GetIPAddress(_ip6Address3);
Assert.AreEqual(_expected3, _actual3,true);string_ip6Address4 ="[2001:0DB8:2de::e13]:9010";string_expected4 ="2001:DB8:2de::e13";string_actual4 = NetWorkToolV2.GetIPAddress(_ip6Address4);
Assert.AreEqual(_expected4, _actual4,true);string_ipAddress5 ="erroriptest";string_expected5 =string.Empty;string_actual5 = NetWorkToolV2.GetIPAddress(_ipAddress5);
Assert.AreEqual(_expected5, _actual5);
}
测试结果:
希望有所帮助!