[Regular Expression] C# 정규표현식 사용 방법

C#에서 정규표현식 객체를 사용하려면 코드 상단에 다음 네임스페이스를 인클루드 해야 합니다.

using System.Text.RegularExpressions;

문자열 매칭

C#에서 정규표현식 객체를 생성할 때는 인자 값으로 넘기는 정규표현식 문자열 앞에 @를 붙여서 정규표현식 문자열의 역슬래시(\)가 이스케이프 되지 않도록 해야 합니다. 입력 문자열이 모바일 번호가 맞는지 확인하는 정규표현식 사용 코드는 다음과 같습니다.

String mobileNumber = "010-1234-5678";
Regex regEx = new Regex(@"^01[01678]-[0-9]{4}-[0-9]{4}$");
if (regEx.IsMatch(mobileNumber))    
{
    Console.WriteLine("Matched");
}

 

정규표현식 객체를 생성할 때 두 번째 인자 값으로 정규표현식 플래그(옵션)을 지정할 수 있습니다. 정규표현식을 선언할 때 플래그를 같이 선언할 수 있는 자바스크립트와 달리 C#은 옵션 객체의 스테틱 속성을 두 번째 파라미터로 넣어서 표현해야 합니다.

정규표현식 매칭 메소드에서 옵션을 사용하는 방법은 다음과 같습니다. 이 정규 표현식은 영문 대/소문자, 숫자, 한글, -(바), _(언더바), .(마침표)를 제외한 문자를 모두 매칭합니다. 입력 받은 문자열에서 특수문자를 모두 제외하려고 할 때 사용합니다.

Regex regex = new Regex(@“[^a-z0-9_.\-ㄱ-ㅎ가-힣]+”,  RegexOptions. Compiled | RegexOptions.IgnoreCase);

정규표현식 옵션을 여러 개 적용하려면 파이프 문자(|)를 사용해서 두 번째 파라미터에 나열식으로 옵션 속성을 표시하면 됩니다.

정규표현식 옵션 객체는 RegexOptions 객체이며, 사용할 수 있는 옵션 속성은 다음과 같습니다. “RegexOptions.플래그”로 속성을 사용합니다.

플래그

자바스크립트
플래그

설명

Compiled

정규표현식을 인터프리팅 하는 대신 MSIL(중간 언어) 코드로 컴파일 되도록 합니다.

컴파일 된 정규표현식은 처음 객체를 생성하는 시점에 컴파일 시간이 더 소요되지만 문자열 매칭을 할 때는 더 빠르게 실행됩니다.

IgnoreCase

i

대/소문자를 구분하지 않고 일치 항목을 찾습니다. 영문 대소문자, 또는 대소문자를 구분하는 언어의 대소문자 구분을 무시합니다.

IgnorePatternWh

itespace

x

정규표현식에서 이스케이프 되지 않은 공백을 매칭 패턴에서 제외합니다. 정규표현식 안에 사용한 공백을 무시합니다.

Multiline

m

여러 줄 모드를 사용합니다. 줄 바꿈 문자(\n)로 줄바꿈이 되는 각각의 행 마다 위치 한정자 ^과 $가 적용되도록 합니다.

NonBacktracking

+(메타문자)

역추적을 사용하지 않습니다. 빠른 매칭을 할 수 있지만, 매칭 결과가 달라질 수 있기 때문에 역추적이 필요 없는 정규표현식에만 제한적으로 사용해야 합니다.

None

옵션 미사용.

RightToLeft

오른쪽에서 왼쪽으로 매칭이 진행되도록 지정 합니다.

Singleline

s

한 줄 모드를 사용합니다. 줄 바꿈 문자(\n)을 포함한 모든 문자와 일치하도록 아무 문자 일치 메타 문자(.)의 용도를 변경합니다.

 

실행 코드에서의 빠른 처리를 위해 복잡한 정규표현식에서는 “Compiled” 옵션을 기본 옵션 값으로 사용하는 것을 추천합니다.

매치되는 모든 문자열을 찾아서 콜렉션으로 얻으려면 다음과 같이 사용합니다.

MatchCollection matches = regex.Matches(str);

찾은 콜렉션 객체는 다음처럼 순회문으로 찾은 값과 개수를 출력할 수 있습니다.

Console.WriteLine(Matches.count); // 매치된 개수 출력
foreach (Match match in matches)
{
     Console.WriteLine(match.Groups["word"].value); // 매치된 문자열 순회 출력
}

스태틱 메소드로 매칭

C#은 닷넷의 정규표현식 객체를 생성하지 않고 정규표현식 객체의 스테틱 메소드로 매칭을 할 수도 있습니다. 일회성일 때는 이 방식이 조금 더 코드가 간결하고 사용하기 쉽니다. 기본적으로는 이 방법을 사용하는 것을 더 추천합니다.

사용 방법은 다음과 같습니다.

Regex.Match(inputStr, regExPattern, regExOptions);

다음은 매칭 문자열이 이메일 주소가 맞는지 확인하는 C# 코드 예입니다.

스테틱 메소드인 Regex.Match()를 사용해서 매칭을 할 때는 두 번째 파라미터가 정규표현식이 되고 세 번째 파라미터가 옵션이 됩니다.

string emailPattern = @"^(\s*;?\s*[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})+\s*$";
Match match = Regex.Match(strEmail, emailPattern, RegexOptions. IgnoreCase);
if (match.Success)
{
    Console.WriteLine("Matched");
}

문자열 바꾸기

정규표현식을 사용해서 찾은 문자열을 다른 문자열로 바꾸는 메소드는 정규표현식 객체가 제공하는 Replace() 메소드를 사용합니다. 앞서 코드 예에서 생성한 정규표현식 객체인 regEx를 사용해 다음처럼 작성할 수 있습니다.

정규표현식 객체를 생성할 때 정규표현식 패턴과 옵션은 인자 값으로 넘기기 때문에 입력 문자열과 바꿀 문자열만을 필요로 합니다.

regEx.Replace(inputStr, replaceStr);

스테틱 메소드를 사용할 때는 사용 방법이 조금 다릅니다. 혼동하지 않도록 주의해야 합니다.

Regex.Replace(inputStr, regExPattern, replaceStr, regExOptions);

스태틱 메소드를 사용해서 문자열 바꾸기를 하면 바꾼 결과 문자열이 리턴 값으로 반환됩니다. 문자열 바꾸기를 하는 코드 예는 다음과 같습니다.

string inputStr = "I love CSharp. CSharp is king.";
string changed = Regex.Replace(inputStr, @"\bC\w+", "Java", RegexOptions.IgnoreCase);
Console.WriteLine(changed); // I love Java. Java is king