Recent Posts
Recent Comments
Link
관리 메뉴

NaggingMachine

{HowToCSharp} 트위터 메시지 정규표현식으로 파싱하기 본문

Visual Studio

{HowToCSharp} 트위터 메시지 정규표현식으로 파싱하기

naggingmachine 2009. 10. 4. 15:40
이 로직은 TwitterTimes 개발하면서 트위터 메시지 파싱할때 사용한 루틴입니다. 트위터 메시지는 하이퍼링크와 골뱅이(@)로 시작하는 사용자 아이디, 그리고 샵(#)으로 시작하는 검색어(그룹?)가 함께 혼용될 수 있으므로 전체 메시지에서 각 부분을 적절하게 나누어줄 필요가 있죠.

트위터 메시지 예제


혹시나 트위터 관련 소프트웨어 개발하실 때 필요하신 분들이 있을까 싶어서 공유합니다. 하이퍼링크 파싱은 어느 블로그에서 가져와서 개선한건데 기억이 안나네요. 보통은 제가 다른 사이트에서 참고하면 주석에 추가해놓는데 말입니다...^^;;

혹시나 문제점이 발견된다면 댓글달아주세요~ ^^
# .NET Framework 3.5 기반의 C# 소스 코드입니다~

/// message로 넘어온 데이터는 하이퍼링크와 @, #이 동시에 포함되어 있기 때문에
/// 이를 잘 나누기 위한 방법이 필요하다. 여기서는 C#에서 기본제공하는
/// 정규표현식을 활용하기 위해 패턴문자열을 구성하였다.
/// 
string pattern = string.Empty;
pattern += @"((http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-]+)+(:[0-9]{2,4})?\/?)"; // 도메인 + 포트
pattern += @"([\.~_0-9a-z-]+\/?)*"; // 서브 루트 또는 서브 디렉터리
pattern += @"(\S+\.[_0-9a-z]+\??)?"; // 파일과 확장자 문자열
pattern += @"([_0-9a-z#&=-?]+)*"; // 매개변수
pattern += @"|@\w*[0-9a-zA-Z_]"; // @로 시작하는 아이디
pattern += @"|#\w*[0-9a-zA-Z_]"; // #으로 시작하는 검색어

/// 패턴 문자열을 이용하여 문자열을 분석한다.
/// 
var r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
var matches = new List();

for (var m = r.Match(message); m.Success; m = m.NextMatch())
{
    if (string.IsNullOrEmpty(m.Groups[0].Value))
        continue;

    matches.Add(m.Groups[0]);
}


/// match된 결과를 오름차순으로 정렬한다.
/// 이 과정이 반드시 필요한 이유는 패턴매칭을 통해서 구한 각각의 패턴들은
/// 모두 문자열 상에서의 시작위치와 길이 정보를 갖게 되는데
/// 실제로 각 문자열을 분석해서 그에 맞게 Run또는 Hyperlink 객체를 생성하기 위해서는
/// 문자열의 앞 부분부터 구간을 끊어나가면서 진행해야 하므로
/// 모든 매칭은 반드시 순서대로 정렬이 되어 있어야 한다.
///
var groupMatches = matches.OrderBy(match => match.Index);