【问题标题】:Regex expression - split string into three variables正则表达式 - 将字符串拆分为三个变量
【发布时间】:2014-08-30 06:01:40
【问题描述】:

要拆分的字符串如下所示:

192.168.1.254445.... 0000 0000 0010 = Flags: 0x002 (SYN)

这个字符串中有3位信息需要被拉到不同的变量中:

 ip - 192.168.1.254
 port - 445
 flag - SYN

ip 是一个 ip 地址,因此它需要捕获完整的地址范围。 端口的长度可以是 1-4 位。 并且标志可以包含三个,三个字母字符,例如SYN 或 SYN、ACK 或 SYN、ACK、URG 等(例如数据包标志的不同组合。

我尝试使用带有 ( : ' ' 的拆分作为拆分,但是每当我输入 [1] 作为输出时,它都会创建一个

 error - Index was outside the bounds of the array.

然后我通过查看C# RegEx string extraction 创建了这段代码:

Regex pattern = new Regex(@"(<?ip>\d+)(<?port>\d+).... \d{4} \d{4} \d{4} \d{4} = Flags: \d{1}x\d{3} ((<?flag>\w+))");
Match match = pattern.Match(dst1);
string ip = (match.Groups["ip"].Value);
string port = (match.Groups["port"].Value);
string flag = (match.Groups["flag"].Value);
string dst = ip + port + flag;
listBox1.Items.Add(dst);

但这不会在 listBox1 中返回任何值。

如果字符串改为:

 192.168.1.254.... 0000 0000 0010 = Flags: 0x002 (SYN)445

这样会更容易吗?

任何建议都会很棒,

谢谢。

【问题讨论】:

  • 你不能,因为没有办法知道ip的最后一个数字在哪里结束,端口号从哪里开始。对于您给出的示例,结果可以是:ip = 192.168.1.25,端口:4445。但也许您有更多关于这种格式的信息。
  • 如果我设法将端口移动到(SYN)后面的末尾,那么可以完成吗?
  • 是的,但是你将如何做出这个举动,这是同样的问题。
  • 我已经更改了字符串从数据中的顺序,以便它可以在最后使用端口读取。
  • 为什么不简单地使用分号作为分隔符:192.168.1.254:445(最常见的格式)。既然您似乎可以访问这些信息,为什么还需要正则表达式来提取信息?

标签: c# regex string winforms


【解决方案1】:

对于这个输入:

192.168.1.254... 0000 0000 0010 = Flags: 0x002 (SYN)445

...使用这个:

(?<ip>(?:\d{1,3}\.){3}\d{1,3}).*Flags:\s\d{1}x\d{3}\s\((?<flag>\w+)\)(?<port>\d+)

...对于具有此格式端口的 IP 地址:

192.168.1.254:445... 0000 0000 0010 = Flags: 0x002 (SYN)

...使用这个:

(?<ip>(?:\d{1,3}\.){3}\d{1,3}):(?<port>\d+).*Flags:\s\d{1}x\d{3}\s\((?<flag>\w+)\)

【讨论】:

  • 刚刚用端口号测试了第一个正则表达式。它适用于包含一个标志的所有数据,例如(SYN) 但有些包含 (SYN,ACK) 或 (RST,ACK)。有没有办法调整这个表达式来包含这些?
  • 你应该可以用一个简单的字符类来做到这一点(即将 \w+ 更改为 [\w,]+)。我调整了表达式(等待管理员批准),但还没有测试。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多