2014-02-06 2 views
0

C에서 정규 표현식을 사용하여 전자 메일에서 일부 정보를 추출하고 싶습니다. 나는이 (가) <> 사이에 주소 "에서", "받는"<> 및 예제에있는 피사체 (사이 주소, 피사체를 추출 할정규 표현식을 사용하여 메일에서 정보 추출

...with mapi id 14.02.0387.000; Thu, 6 Feb 2014 09:09:33 +0100 
From: site <[email protected]> 
To: "[email protected]" <[email protected]> 
Subject: can this bounce 
Thread-Topic: can this bounce 
Thread-Index: Ac8jEr8t3k2RouQ1RaGPCXGFcE5oNg==Date:... 

: 여기

이메일에서 짧은 조각이다 "이것이 바운스 할 수 있습니까?")

저는 정규식에 익숙하지 않아 도움이되었습니다.

(그리고 BTW, 내가 듣고 드리겠습니다 간단한 더 깔끔한 해결책이 있다면!)

+0

http://hpop.sourceforge.net/ – nhahtdh

답변

1

해결책 LINQ 사용 : (. *?)

var fromAddress = new string(msg.SkipWhile(c => c != '<').Skip(1).TakeWhile(c => c != '>').ToArray()); 

var toAddress = new string(msg.Substring(msg.IndexOf("To")).SkipWhile(c => c != '<').Skip(1).TakeWhile(c => c != '>').ToArray()); 

var subject = new string(msg.Substring(msg.IndexOf("Subject")).SkipWhile(c => c != ' ').Skip(1).TakeWhile(c => c != 'T').ToArray()); 
+0

아주 깔끔한, 그리고 작품! 이제 문제는 실제 메일이 여러 줄로 구성되어 있다는 것입니다. LINQ 표현식의 요구 사항을 충족시키는 첫 번째 줄은 실제로 올바른 줄이 아니므로 처음 줄을 건너 뛸 필요가 있습니다. 첫 번째 줄 대신 문자열의 마지막 줄을 선택 하시겠습니까? –

+0

'string.Substring'으로 첫 줄을 건너 뛸 수 있습니다. 예를 들어'message.Substring (message.IndexOf ("startFromHere"))' –

0

< \>을

< \
  • : <는 메타 문자이며 문자 그대로 일치 할 경우 탈출해야합니다.
  • (. *?) : 모든 것을 욕심없는 방식으로 일치시키고 캡처하십시오.
  • > :>는 메타 문자이므로 문자 그대로 과 일치 시키려면 이스케이프해야합니다.
1

전체 실행 예를 사용하여 정규 표현식 :
@"[Ff]rom:[^<]*\<([^@][email protected][^>]+)>[Tt]o:[^<]*\<([^@][email protected][^>]+)>[Ss]ubject: ?(.*)Thread-Topic") 내부 메일 기호 (존재하는 경우 내가 확인

string source = "...with mapi id 14.02.0387.000; Thu, 6 Feb 2014 09:09:33 +0100From: site <[email protected]>To: \"[email protected]\" <[email protected]>Subject: can this bounceThread-Topic: can this bounceThread-Index: Ac8jEr8t3k2RouQ1RaGPCXGFcE5oNg==Date:..."; 
Regex pattern = new Regex("[Ff]rom:[^<]*\\<([^@][email protected][^>]+)>[Tt]o:[^<]*\\<([^@][email protected][^>]+)>[Ss]ubject: ?(.*)Thread-Topic"); 
MatchCollection mc = pattern.Matches(source); 
string partFrom = ""; string partTo = ""; string subject = ""; 
if(mc.Count>0) 
{ 
    partFrom = mc[0].Groups[1].Value; 
    partTo = mc[0].Groups[2].Value; 
    subject = mc[0].Groups[3].Value; 
} 
Console.WriteLine("From: " + partFrom + " To: " + partTo + " Subject: " + subject); 

@) 내 표현과 추출물 :
나는 3 개 그룹으로 패턴을 사용 모든 부분을 단일 패턴으로. 당신이 할 수 있도록라는 이름의 캡처 그룹으로 나누기,

@"\<[^>@][email protected][^>]+>" 
+0

방금 ​​해결책을 시도했지만 어떤 이유로 mc.Count는 결코> 0 .. :( –

+0

나는 나의 해결책을 시험해 본 결과이 결과를 얻는다 :'From : [email protected] To : [email protected] Subject : 이것은 바운스 할 수 있는가? '그래서 당신은 다른 결과를 얻을 수 없다.나는 당신이 다른 입력을 사용한다고 확신한다. 당신이 그것을 테스트 한'source' 문자열의 전체 내용을 보낼 수 있습니까? .. 또는 질문을 업데이트하고 이미 테스트 한 것을 작성하십시오. – Atiris

+0

안녕하세요 Atiris, 예. 다른 입력기를 사용합니다. 그것 때문에 꽤 오래 여기에 게시하지 않았다. 여기에 어떤 메일 시스템을 사용하여 보낼 수 있습니까, 아니면 어떻게할까요? –

0

나는 당신의 원본 텍스트를 사용하여 .NET 맛과 RegexBuddy이 시도 : 당신이 에만 메일 주소을 찾을하려는 경우
,이 정규식을 사용할 수 있습니다

그런 다음 일치 항목을 반복하여 일치하는 항목에 지정된 캡처 그룹의 값이 포함되어 있는지 확인할 수 있습니다. 필자는 불완전한 문서를 검색 할 때이 방법을 사용했습니다.

(?:From: .+<(?<FROM>.+)>)?(?:To: .+<(?<TO>.+)>)?(?:Subject: (?<SUBJECT>.+))?

+0

Atiris의 답변과 함께 사용하십시오 :) – Tom

관련 문제