프로그래밍을 하다 보면 코드의 일부 내용을 반복적으로 바꿔줘야할 때가 있다.
오래된 프로젝트를 리팩토링한다거나 프로젝트 문자셋을 멀티바이트에서 유니코드로 바꿀 때가 그 대표적인 예다.
물론 일일이 컴파일 오류나는 부분을 찾아서 바꿔주거나 전체 찾기해서 바꿔주는 원초적인 방법이 있다.
보다 효율적이고 능률적인 방법을 소개하겠다.
바로 정규표현식(aka. 정규식)을 사용한 찾기 및 바꾸기이다.
C++에서는 정규식이 조금 낯설수 있는데, 간략하게 설명하자면 정규표현식이란, 문자열에서 일정한 규칙(Pattern)을 갖는 문자열 집합(Group)을 찾아내는 것이다.
필자는 멀티바이트로 작성된 프로젝트를 유니코드로 바꾸는 과정에서 수많은 문자열 메시지 부분을 유니코드에 맞게 바꾸줘야하는 작업을 위 정규식을 이용해 작업했다.
찾기 바꾸기 대화상자(단축키:Ctrl+Shift+F)에서 찾기옵션에 정규식 사용에 체크를 해야한다.
MFC의 대표적인 문자열 타입인 Cstring의 경우 멀티바이트 인 경우 큰따옴표("")로 문자열을 표시했지만,
유니코드로 바꾸려면 _T 매크로를 넣어주거나 L를 앞에 넣어줘야한다.
물론 _T 매크로가 삽입되어 있다면, 매크로에서 자동으로 L로 변환이 된다.
(멀티바이트든, 유니코드는 _T 매크로를 넣어주는 버릇을 갖다.)
_T매크로는 _T(로 시작해서 괄호) 로 끝나기 때문에 그냥 찾아 바꾸기만 해서는 안된다.
다음은 내가 가장 많이 쓰는 정규식이다.
1. Cstring의 Format 멤버함수
예시:
찾을 대상
strTitle.Format("%s: ABCDEFG123456가나다라", this->getTitle());
바꿀 문자열
strTitle.Format(_T("%s: ABCDEFG123456가나다라"), this->getTitle());
Format 멤버함수의 문자열을 감쏴고 있는 큰따옴표 앞에 _T 매크로를 넣어줘야한다.
정규표현식:
찾을 문자열:
.Format\(\"(.*)\"
바꿀 문자열
.Format(_T("$1")
위에서 보다시피 정규식을 찾을때에는 문자열에 포함되는 괄호, 따옴표에 대해서는 백슬래시(\)로 구분을 해줘야한다.
그리고 바꿀 문자열에 대해서는 백슬래시가 필요없으며 그룹 문자열($1,$2,$3...) 등을 사용하면 된다.
2. Afxmessage 메시지 팝업
예시:
찾을 대상
AfxMessageBox("입력값 초과");
바꿀 문자열
AfxMessageBox(_T("입력값 초과"));
정규표현식:
찾을 문자열:
AfxMessageBox\(\"(.*)\"
바꿀 문자열
AfxMessageBox(_T("$1")