2014-09-08 5 views
0

Поэтому у меня есть следующие строки:необязательного матч несколько строк

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

Я пытаюсь создать Regex, который будет соответствовать всем из этих строк, и я пытаюсь отделить определенное содержание. В настоящее время я создал следующее Regex.

Regex pattern = new Regex(@"(?<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, флаг = SYN и порт = 445. Однако это будет соответствовать только первой строке. Я хочу, чтобы часть флага содержала SYN - SYN,ACK - SYN,ACK,PSH возможно даже четвертый, такой как SYN,ACK,PSH,URG.

Я попытался, глядя на опциональной регулярное выражение (но не могу заставить его работать), такие как:

Regex pattern = new Regex(@"(?<ip>(?:\d{1,3}\.){3}\d{1,3}).*Flags:\s\d{1}x\d{3}\s\((?<flag>[\w,]+)\)(?<port>\d+)"); 

или создания нескольких регулярных выражений, чтобы соответствовать каждому из них по отдельности (это препятствует остальной части программы).

Я думаю, что создание ACK, частей PSH необязательно, но я не могу заставить его работать.

+0

В Интернете есть множество инструментов тестирования RegEx. [Это] (http://regexlib.com/RETester.aspx?AspxAutoDetectCookieSupport=1) позволяет указать механизм .NET RegEx. Запутайтесь с несколькими из них и найдите тот, который позволит вам быстро протестировать и уточнить ваши выражения. – HABO

ответ

0

Используя this awesome regex tester, я обнаружил, что

((?: \ D {1,3}) {4}.) .. (?: (?: \ Г) {4}) {3} = Флаги: \ dx \ d {3} ((?: (\ W {3}),?) +) (\ D +)

Подходит для ваших нужд. Обязательно играйте с опцией Multiline и используйте член .Matches.

0

Ваше первое регулярное выражение близко. Проблема заключается в группе flag: \w+ соответствует SYN, но он разбивается на запятую в SYN,ACK или SYN,ACK,PSH.

Вы можете это исправить, добавив дополнительную, Неуловленную группу, которая включает в себя запятую, например так:

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

Вы можете заменить это.

(?<flag>\w+) 

С

((?<flag>\w+),?)+ 

Объяснение

(?<flag>\w+) -> take word 
,?   -> optional comma 
()+   -> at least 1 flag 

При использовании Matches вы получите 3 спички и принять все флаги, вы можете использовать Captures.

var regexPattern = @"(?<ip>(?:\d{1,3}\.){3}\d{1,3}).*Flags:\s\d{1}x\d{3}\s\(((?<flag>\w+),?)+\)(?<port>\d+)"; 
var pattern = new Regex(regexPattern); 
var matches = pattern.Matches(input); 
foreach (Match match in matches) 
{ 
    var ip = match.Groups["ip"].Value; 
    var port = match.Groups["port"].Value; 
    var flags = match.Groups["flag"].Captures 
     .Cast<Capture>() 
     .Select(c => c.Value) 
     .ToArray();   
} 
+0

Спасибо, что помогли Юлиаму, я попробовал ваш вариант выше, и он дает следующие результаты. Использование: «string dst =» DST IP: «+ ip +» DST Port: «+ port +» Используемый флаг: «+ flags;' Я получаю System.String [] для флагов. Когда я использую: 'строка ДСТ = "DST IP:" + ф + "DST порт:" + порт + "Флаг используется:" + флаги;' С - 'string.join ("" , flags); ' Я получаю первое значение, но не другие. – Taz

+0

@Taz, 'string.Join (", ", flags)' правильно, возможно, вы отлаживаете первое совпадение '0x002 (SYN) 445', которое не содержит более одного флага, если вход является строкой который содержит '0x002 (SYN, ACK, PSH) 445', он должен получить 3 флага, вот [demo] (https://dotnetfiddle.net/iU9L2a) –

+0

Дилемма в том, что у меня есть источник данных, который содержит несколько разных строк, которые могли бы выглядеть как упомянутые выше. Мне нужно получить данные (ip, порт и флаги) для каждого из них. Независимо от того, сколько флагов присутствует. Поскольку первое совпадение, с которым он сталкивается, представляет собой строку с одним флагом (SYN), она пропускает другие строки (с несколькими флагами). Есть идеи? – Taz

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