2014-07-10 1 views
1

C# 응용 프로그램에서 정규식을 사용하여 자유 형식 텍스트가 포함 된 데이터베이스 필드를 분리하려고합니다. 추가 된 주석은 단순히 사람의 설명을 끝에 추가합니다.C#의 정규 표현식을 사용하여 여러 줄의 텍스트를 matchcollection으로 분할

Bob Smith [21-Mar-2013 10:46:02 AM]: this that and the other thing 

followed by some linefeeds and somesuch 

Alexey Jones [08-Jul-2013 1:44:59 PM]: and here is some other comment that I, Alexey deemed worthy to put into the system 

I also like using the enter key 

Kim Katillicus [09-Jun-2014 2:34:43 PM]: Don't forget about my comments 

목적은 알렉세이가 (이 정적 보고서로 출력됩니다) 자신의 의견과 다른 사람이 아닌 의견의 출력을보고 싶어한다는 것입니다 :이 샘플 형식입니다. 나는 각 사람 항목에서 단지 첫 번째 줄에 하나의 큰 덩어리 포함하는 모든 또는 별도의 일치를 얻을 수 있었다

^(.*\[\d{2}-\w{3}-\d{4}.*(AM|PM)\]:\s[\s\S]*)* 

: 나는 다음과 같은 정규식 패턴의 변화를 이용하여 경기 수집을 돌아 오게하려합니다. 이 패턴을 고치는 데 도움이 필요합니다. 나가 가지고있는 것에 가까워지고 있는지, 또는 틀린 나무를 짖고 있는지 확실하지 않다.

참고 : Expresso로 표현을 테스트하고 있습니다. 지금은 여러 줄 스위치를 확인했습니다.

말한다
[\s\S]* 

는 "중 하나가 0 번 이상하지 공백 아무것도 일치"

+0

의견은 항상 한 줄로 표시됩니까? 그렇다면 더 간단하고 우수한 성능의 솔루션을 제공 할 수 있습니다. – evanmcdonnal

+0

@evanmcdonnal 질문 텍스트에서 OP에 여러 줄의 솔루션이 필요하다는 사실을 분명히 알 수 있습니다. –

+0

위의 텍스트에서 '3'별도의 일치가 있어야합니다, 맞습니까? – hwnd

답변

0

문제는이 부분이다. 이것은 표현의 시작 부분이 처음 나타난 후 모든 것을 포함합니다.

답변은 단일 정규 표현식으로 표현할 수있는 것보다 더 많은 논리가 필요하다고 생각됩니다. 예를 들어, @evanmcdonnal이 지적했듯이, 개행 문자를 분리 한 다음 각 줄을 프리앰블 RegEx와 대조하여 다음 일치 때까지 한 줄로 한 줄로 병합 할 수 있습니다. 다음은 C#을 방법은 다음과 같습니다

public static class CommentsExtractor 
{ 
    private static Regex preambleExpression = 
     new Regex(@"^.*\[\d{2}-\w{3}-\d{4}.*(AM|PM)\]:\s"); 

    public static List<string> CommentsFromText(string text) 
    { 
     var comments = new List<string>(); 

     var lines = text.Split(new char[]{'\n', '\r'}, 
      StringSplitOptions.RemoveEmptyEntries); 

     var currentComment = new StringBuilder(); 
     bool anyMatches = false; 

     foreach (var line in lines) 
     { 
      var match = preambleExpression.Match(line); 

      // If we see a new preamble, it's time to push 
      // the current comment into the list. 
      // However, the first time through, we don't have 
      // any data, so we'll skip it. 
      if(match.Success) 
      { 
       if (anyMatches) 
       { 
        comments.Add(currentComment.ToString()); 
        currentComment.Clear(); 
       } 
       anyMatches = true; 
      } 

      currentComment.AppendLine(line); 
     } 

     // Now we need to push the last comment 
     comments.Add(currentComment.ToString()); 

     return comments; 
    } 
} 

동작하는 예제 WPF 응용 프로그램은 Github 볼 수 있습니다.

+0

오스틴에게 감사드립니다. 기본 무언가를 사용하여 인덱스 목록을 얻고 거기에서 분리하는 방법을 생각해 보았습니다.하지만 솔루션이 훨씬 깨끗하다고 ​​생각합니다. 나는 Rexex와 함께 더 섹시한 방법이 있었으면 좋겠다고 생각했지만, \ s \ S에 대한 당신의 관점을보십시오. 나는 "당신이 다음 경기를 치기 전까지 이름/날짜 + 모든 텍스트를 기반으로 한 경기"라고 말할 수있는 방법이있을 것이라고 생각했습니다. 다른 모든 사람들에게 감사드립니다. – CDiscord

관련 문제