본문 바로가기

C#/정규 표현식

C#에서 정규 표현식을 사용하여 문자열을 치환하는 방법 (Regex.Replace 메서드)

1. Regex.Replace 메서드를 사용하여 문자열 치환 방법

 

정규 표현식은 String.Replace 메서드로는 할 수 없는 유연한 처리를 수행할 수 있다.

 

정규 표현식을 사용해서 치환하려면 Regex 클래스에 있는 Replace 메서드를 사용한다.

 

1) 서로 약간 다른 표기를 원하는 표기로 수정

 

“쪼금씩”, “쪼끔씩”, “쬐끔씩”과 같이 서로 약간 다른 표기들을 모두 “조금씩”으로 수정하려고 한다.

var text = “C# 공부한 내용을 쪼끔씩 정리하자.”;
var pattern = @”쪼금씩|쪼끔씩|쬐끔씩”;
var replaced = Regex.Replace(text, pattern, “조금씩”);
Console.WriteLine(replaced);

 

Regex.Replace 메서드는 지정할 입력 문자열(첫 번째 인수) 안에서 정규 표현식(두 번째 인수)에 일치하는 모든 부분 문자열을 세 번째 인수에 지정한 문자열로 치환한다.

결과 : "C# 공부한 내용을 조금씩 정리하자."

 

 

2) 콤마 뒤에 항상 공백을 두도록 수정

 

“Sword, Spear ,Bow , Shield,Gun”

이 문자열은 ‘,’ 앞뒤에 있는 공백 개수가 일정하지 않다.

콤마 앞뒤의 공백을 정규 표현식으로 정리한다.

var text = “Sword, Spear ,Bow , Shield,Gun”;
var pattern = @”\s*,\s*”;
var replaced = Regex.Replace(text, pattern, “, “);
Console.WriteLine(replaced);
결과 : “Sword, Spear, Bow, Shield, Gun”

 

@”\s*,\s*”

\s공백 문자를 나타내고 *직전의 요소가 0번 이상 반복됨을 나타낸다.

그래서 다음과 같은 문자열과 일치한다.

“,”    //앞 뒤로 공백 없음
“, “   //뒤에 공백
“ ,”   //앞에 공백
“ , “  //앞 뒤로 공백

 

 

String 클래스에 있는 Replace 메서드로는 고정적인 문자열만 치환할 수 있지만 정규 표현식을 사용하면 매우 유연하게 문자열을 치환할 수 있다.

 

 

 

3) “.htm”을 “.html”로 수정

 

 “html”이라는 부분 문자열은 “htmll”처럼 ‘l’이 연속되지 않게한다.

var text = “ex1.htm ex2.html ex3.htm”;
var pattern = @”\.(htm)\b”;
var replaced = Regex.Replace(text, pattern, “.html”);

 

이 코드에서 사용된 정규 표현식에 ‘\b’는 단어의 경계를 나타낸다.

 

대상 문자열에 포함된 “ex2.html”은 매칭하지 않으므로 치환대상에서 제외된다.

 

 

 

2. 그룹화 기능을 이용한 문자열 치환 방법

 

1) 숫자의 바로 뒤에 있는 “바이트”라는 문자열을 “byte”로 수정

 

정규 표현식으로 나타내면 @”\d+바이트”일 때만 “바이트”라는 문자열을 “byte”로 변환한다.

var text = “1024바이트, 8바이트 문자, 바이트, 킬로바이트”;
var pattern = @”(\d+)바이트”;
var replaced = Regex.Replace(text, pattern, “$1byte”);
Console.WriteLine(replaced);
결과 : 1024byte, 8byte 문자, 바이트, 킬로바이트

 

치환 문자열 안에 있는 “$1”라는 부분이 이 프로그램에서 가장 중요한 부분이다.

 

$1, $2, ...은 정규 표현식의 그룹화 기능에서 ()에 대응되며 “$1”이라고 쓰면 “(\d+)”에 일치하는 부분 문자열을 치환한다.

위의 예에서는 처음 일치하는 위치에서는 “1024”가 $1로 치환되고 두 번째 일치하는 위치에서는 “8”이 $1로 치환된다.

 

 

2) 16자리의 숫자 문자열을 4자리마다 하이픈(-)으로 구분

 

var text = “1234567890123456”;
var pattern = @”(\d{4})(\d{4})(\d{4})(\d{4})”;
var placed = Regex.Replace(text, pattern, “$1-$2-$3-$4”);
Console.WriteLine(replaced);
결과 : 1234-5678-9012-3456

 

 

{4}라고 지정한 것은 ‘직전의 요소와 정확히 네 번 일치한다’라는 것을 나타낸다.

 

이 코드에서는 \d{4} 숫자가 네 번 연속됨을 나타낸다.