2014-08-29 4 views
0

Строки дробить выглядит так:Regex выражения - разбить строку на три переменные

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

Есть три бита информации в этой строке, которые должны быть выведены различными переменными, которые являются:

ip - 192.168.1.254 
port - 445 
flag - SYN 

IP-адрес ip, поэтому он должен будет захватить весь диапазон адресов. Порт может быть от 1 до 4 цифр. , и флаг может содержать три символа с тремя буквами, например. SYN или SYN, ACK или SYN, ACK, URG и т. Д. (Например, различные комбинации флагов пакетов.

Я попытался использовать Split с (: '' как разрывы, но всякий раз, когда я помещаю [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 

Будет ли это проще?

Любые предложения были бы замечательными,

Спасибо.

+1

вы не можете, потому что нет способа узнать, где заканчивается последний номер ip и где начинается номер порта. В примере, который вы указали, результатом может быть: ip = 192.168.1.25, порт: 4445. Но, возможно, у вас есть дополнительная информация об этом формате. –

+0

Если мне удастся переместить порт в конец позади (SYN), это можно сделать тогда? – Taz

+0

Да, но как вы это сделаете, это та же проблема. –

ответ

0

Для этого входа:

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+)\) 
+0

Просто протестировал первое регулярное выражение с номером порта в конце. Он работает для всех данных, содержащих один флаг, например. (SYN), но есть некоторые, которые содержат (SYN, ACK) или (RST, ACK). есть ли способ адаптировать это выражение для их включения? – Taz

+0

Вы должны иметь возможность сделать это с помощью простого символьного класса (I.e. change \ w + to [\ w,] +). Я изменил выражение (до утверждения администратора), но не проверил его. – Colin

Смежные вопросы