.NET 에서는 Find나 Replace 등의 기능을 쓸때 Regular Expression 을 쓸 수가 있다. Replace 를 사용할때 Regular Expression 을 잘 사용하면 분명히 많은 노가다성 수정을 간편하게 할 수 있을 것이라 생각했다. 단순히 Regular Expression 을 찾는데만 활용하도록 내버려 두지 않았을테니까...

그래서 검색 끝에 가능한 방법을 알아냈다. 내가 이번에 한 것을 예제로, 간단하게 설명하겠다.

현재 작성 중인 코드에 다음의 수십가지 enum 값들이 있다.

ASE_3DSMAX_ASCIIEXPORT,
ASE_COMMENT,
ASE_SCENE,

이런 것들인데, 첫번째 ASE_3DSMAX_ASCIIEXPORT로 예를 들면

ASE_3DSMAX_ASCIIEXPORT, 가

if(  str == "*3DSMAX_ASCIIEXPORT" ) return ASE_3DSMAX_ASCIIEXPORT;

의 형태로 바껴야 한다. ASE_로 시작하는 부분을 찾고 영문자 대문자나 dash(_) 의 문자만 포함하고, 끝이 쉼표(,)로 끝나는 것을 찾아 위의 코드로 바꾸는 것이 그 목적이다. 이때 이 문자가 교체될 코드는 먼저 ASE_가 빠지고 *로 시작하는 문제열과 비교하게 된 후 원래 값을 그대로 return 하게 된다.

이것을 하기 위해 Cntrl+H를 눌러서 Replace 창을 열고 왼쪽 아래에 Use : Pregular expressions 를 체크한다.

Find what 부분에는 다음이 오게 된다.

ASE_{[A-Z|_]*},

Regular Expression 의 자세한 설명은 참고 자료를 참고한다.[1]

먼저 ASE_로 시작한다는 것을 알린다. [A-Z] 는 A와 Z사이의 글자(즉 영문자 대문자)를 의미하고 [A-Z]* 의 Asterisk(*)는 이것이 0번이나 여러번 반복한다는 의미이다. 여기서 dash 문자도 받아야 하기 때문에 or을 의미하는 vertical bar(|)를 사용하여 [A-Z|_]* 로 표현한다. 이렇게 되면 대문자와 dash의 여러 문자를 인식하게 된다. 그 후 끝에 쉼표(,)를 달아 쉼표로 끝나게 됨을 알린다.

이때 중요한건 brace({, }) 이다. 본래 regular expression 에서 brace는 다른 것으로 쓰이지만 여기서는 .NET의 역참조를 위해 사용된다. 즉, 쉽게 말하면 { } 안에 들어가는 문자들이 1번으로 저장된다고 생각하면 된다.

그러면 Replace 창에 있는 Replace with 에는 다음과 같이 넣는다.

if( str == "\*\1" ) return ASE_\1;

이때 \* 로 써 *를 표현하고, \1은 위에 말한 역참조 1번을 의미한다. 위에서 언급한 역참조 1번이 그대로 여기 \1로 바뀌는 것이다. 따라서 ASE_3DSMAX_ASCIIEXPORT 의 경우 3DSMAX_ASCIIEXPORT 가 역참조 1번이 된다.[2][3]

이렇게 하면 나름대로 굉장히 귀찮을 수 있는 수정작업을 간단하게 할 수 있다. Regular Expression 은 다양하게 사용되는 범용적인 표현 법이니 어느정도만이라도 알아두면 좋을 것이다. 또 그것을 사용하여 .NET 에는 역참조라는 기능으로 더욱 편리하게 사용할 수 있다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/08/02 09:03 2007/08/02 09:03

트랙백 주소 :: http://www.hybrid.pe.kr/tt/trackback/241

댓글을 달아 주세요

[로그인][오픈아이디란?]