使用正则表达式获取部分IP和端口号

本文关键字:口号 IP 正则表达式 获取部 | 更新日期: 2023-09-27 18:02:55

我试图在c# Visual Studio 2013中使用正则表达式,我需要得到一个看起来像192.168.1.254:65的字符串。我需要做的是将这个字符串分解为两个值,一个IP地址和一个端口号,冒号左边的所有内容都将是IP地址,冒号右边的所有内容都将是端口,我需要在c#代码中使用正则表达式来完成此操作。因此,请在代码中添加任何名称空间,以便在c#中使用正则表达式,示例如下

string mystring = "192.168.1.254:65";
string myipaddress = RegularExpressionMethod(ExpressionToGetIp, mystring);
string myportnumber = RegularExpressionMethod(ExpressionToGetPort, mystring);

这与IPEndPoints无关它是一个通用的抽象方法

使用正则表达式获取部分IP和端口号

使用.Split()方法:

string mystring = "192.168.1.254:65";
string[] s = mystring.Split(':');
string ip = s[0]; // "192.168.1.254"
string port = s[1]; // "65"

如果需要仔细检查IP和端口号格式是否正确,可以添加System.Net;命名空间,然后解析每个字符串:

try
{
    IPAddress IP = IPAddress.Parse(ip);
    int PortNum = Int32.Parse(port);
}
catch
{ 
    // catch any exceptions here
}

或者更简单的方法可能是(由EZI提醒我)使用.TryParse()方法。这比较容易处理,因为它输出一个bool

IPAddress IP;
int PortNum;
if (IPAddress.TryParse(s[0], out IP)) // If it is a valid IP
    { MessageBox.Show("IP address in correct format"); }
else { MessageBox.Show("IP address not in correct format"); }
if (Int32.TryParse(s[1], out PortNum)) // If it is a valid Port Number
    { MessageBox.Show("Port Number in correct format"); }
else { MessageBox.Show("Port Number not in correct format"); }

你不可能重新发明轮子,说这样的话:

string myString = "192.168.1.254:65";
UriBuilder uri  = new UriBuilder("http://" + myString );
string     host = uri.Host ;
int        port = uri.Port ;

你可以简单地说:

string[] parts = myString.Split(":");
string host = parts[0] ;
string port = parts[1] ;

但是你应该意识到,如果你得到IPv6地址字面值,这将打破。

你可以使用正则表达式:

Regex rx = new Regex( @"^(?<host>.+):(?<port>'d+)$");
Match m  = rx.Match(myString);
if ( !m.Success ) throw new FormatException() ;
string host =            m.Groups["host"].Value   ;
int    port = int.Parse( m.Groups["port"].Value ) ;

或者你可以更花哨一点,写一个扩展方法:

static class ExtensionMethods
{
  public static DnsEndPoint ToDnsEndpoint( this string text)
  {
    Match m = rxDnsEndpoint.Match(text);
    if ( !m.Success ) throw new FormatException("invalid endpoint format");
    string        host     =            m.Groups["host"].Value   ;
    int           port     = int.Parse( m.Groups["port"].Value ) ;
    IPAddress     address  ;
    bool          parsed   = IPAddress.TryParse( host , out address ) ;
    AddressFamily family   = parsed ? address.AddressFamily : AddressFamily.Unspecified ;
    DnsEndPoint   endpoint = new DnsEndPoint( host , port , family ) ;
    return endpoint;
  }
  private static Regex rxDnsEndpoint = new Regex( @"^(?<host>.+):(?<port>'d+)$");
}

它允许你写像

这样的东西
DnsEndpoint endpoint = myString.ToDnsEndpoint() ;