[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