Home Full Site
Regular Expression (Regex 클래스)

흔히 복잡한 문자열 처리를 위해 Regular Expression을 사용하는데, .NET에서는 이 기능을 Regex 클래스를 중심으로 구현하고 있다. .NET의 Regular Expression기능은 대부분 Perl에서 진화한 것으로 Perl 5 Regular Expression과 호환되도록 설계되었다. Regular Expression을 사용하면, 대량의 문자열 데이타에서 특정 패턴을 찾아내거나 특정 패턴 문자열을 다른 것으로 치환하는 등의 일을 쉽게 구현할 수 있다. 따라서 Regular Expression은 Web Crawler나 로그 파싱 등에 매우 유용한 기능이라 할 수 있다.



Regex 문자열 패턴 찾기

가장 초보적인 Regualr Expression 사용 예로써 Regex 클래스를 사용하여 특정 문자 패턴을 찾는 몇가지 예들을 들어 보자. 아래 Ex1 예제는 [강남]이라는 문자열을 입력문자열(str)에서 찾는 단순한 코드이다. Regex클래스 객체를 생성할 때, 특정 문자 패턴을 파라미터로 전달하며, Regex 객체의 Match() 메서드를 사용하여 특정 패턴이 입력 문자열에 존재하는지 체크하게 된다. Regex.Match() 메서드는 매치된 정보를 갖는 Match 클래스 객체를 리턴한다. 만약 매치된 문자열이 존재하면 Match.Success 속성이 True가 되고, Match.Index 속성을 통해 문자 패턴 위치를 알 수 있다.
Ex1은 첫 번째 매칭 문자열만을 리턴하는데, 복수개의 매칭 문자열이 존재할 수 있으므로, Ex2에서 처럼 계속 루프를 돌며 NextMatch()를 호출 모든 매칭 데이타를 찾아낼 수 있다.
Match클래스는 하나의 매칭 데이타만을 갖는데, 이와 상응하는 컬렉션 클래스로 MatchCollection 클래스가 있다. Ex3 예제는 Regex.Matches() 메서드를 통해 모든 매칭 문자열들을 한꺼번에 MatchCollection 객체로 리턴하는 예를 보여주고 있다.


예제

// Ex1. 첫 매치 문자열 출력
string str = "서울시 강남구 역삼동 강남아파트";
Regex regex = new Regex("강남");
Match m = regex.Match(str);
if (m.Success)
{
    Debug.WriteLine("{0}:{1}", m.Index, m.Value);
}

// Ex2. 매치된 문자열 계속 출력
Regex regex = new Regex("강남");
Match m = regex.Match(str);
while (m.Success)
{
    Debug.WriteLine("{0}:{1}", m.Index, m.Value);
    m = m.NextMatch();
}

// Ex3. Matches() 메서드
Regex regex = new Regex("강남");
MatchCollection mc = regex.Matches(str);
foreach (Match m in mc)
{
    Debug.WriteLine("{0}:{1}", m.Index, m.Value);                
}



Regex 메타문자

Regular Expression에는 일반 문자 리터럴(literal)과 특별한 의미를 갖는 메타문자(metacharacter)를 사용할 수 있다. 메타문자에는 외우기 힘들 정도로 매우 많은 문자들이 있는데, 그 중 많이 사용되는 몇 가지를 예로 들면 다음과 같다. 예를 만약 문자패턴을 ^강\w*구$ 와 같이 정하면, 이는 한 라인에서 강으로 시작해서 구로 끝나는 문자열들을 찾게 된다.

예제

MatchCollection mc = Regex.Matches(str, @"^강\w*구$");

메타문자  의미            
------------------------
^        라인의 처음      
$        라인의 마지막    
\w       문자(영숫자) [a-zA-Z_0-9]
\s       Whitespace (공백,뉴라인,탭..)
\d       숫자
*        Zero 혹은 그 이상
+        하나 이상
?        Zero 혹은 하나
.        Newline을 제외한 한 문자
[ ]      가능한 문자들
[^ ]     가능하지 않은 문자들
[ - ]    가능 문자 범위
{n,m}    최소 n개, 최대 m개
(  )     그룹
|        논리 OR



Regex 문자열 분리(Split)

Regex 클래스 Split() 메서드는 특정 패턴의 문자열을 기준으로 입력문자열을 분리하는데 사용된다. 예를 들어, 아래 예제는 공백(blank)을 기준으로 입력주소를 분리(split)하여 문자배열을 담아 리턴하는 예이다.

예제

string str = "서울시 강남구 역삼동 강남아파트";

Regex regex = new Regex(" ");
string[] vals = regex.Split(str);
foreach (string s in vals)
{
    Debug.WriteLine(s);
}



© csharpstudy.com