2012-12-19 1 views
0

정규식으로 IRC messages을 구문 분석하는 것이 깔끔할 것이라고 생각했습니다.정규식은 IRC 메시지를 구문 분석합니다

(?::(?<Prefix>[^ ]+) +)?(?<Command>[^ :]+)(?<middle>(?: +[^ :]+)*)(?<coda> +:(?<trailing>.*)?)? 

그럼 내가 메시지의 두드러진 요소를 얻기 위해 다음과 같은 .NET 코드와 이것을 사용 : :이 늘어나는만큼 가지고

Prefix = matches.Groups["Prefix"].Value; 
Command = matches.Groups["Command"].Value; 

var parameters = new List<string>(); 
parameters.AddRange(matches.Groups["middle"].Value 
    .Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)); 
parameters.Add(matches.Groups["trailing"].Value); 

Parameters = parameters.ToArray(); 

을하지만 내가해야한다는 싫어 코드에서 따로 분리하십시오. middle 그룹에서 여러 경기를 얻을 수있는 방법이 있습니까?

+0

이러한 메시지를받을 수 있습니까? – snurre

+0

'RawMessage'는 문자열입니다. – Superbest

+2

인터넷에서 빠른 검색 결과는 다음과 같습니다. http://news.anarchy46.net/2012/01/irc-message-regex.html http://forrst.com/posts/Regular_expression_to_match_raw_IRC_messages-e0F – Mir

답변

2

반복되는 그룹의 Captures 속성을 사용할 수는 있지만 조언하지는 않습니다.

먼저 당신이 당신의 패턴을 변경해야합니다 : 두 번째

@"(?::(?<Prefix>[^ ]+) +)?(?<Command>[^ :]+)(?<middle>(?: +[^ :]+))*(?<coda> +:(?<trailing>.*)?)?" 

을, 당신은 할 것 : 어떤 형식에서

parameters.AddRange(match.Groups["middle"].Captures. 
        OfType<Capture>(). 
        Select(c => c.Value)); 
+0

고마워요! 왜 조언하지 않니? – Superbest

+0

@Superbest 모든 언어가 반복 캡처 그룹 (예 : Java)을 지원하는 것은 아닙니다. 코드를 이식해야한다면, 가장 나쁜 버그가 발생할 가능성이 큽니다. – Mir

+0

@Eve 항상이 인수를 사용하면 Brainf * ck 호환 코드를 작성하게됩니다. –