programming/c#

정규식 노가다(??)...

happy4u 2005. 1. 17. 15:24

쩝... 새해가 되면서 내 나이도 이제 베스킨라빈스...

 

머리가 나빠진건지... 정규식을 이용해 간단한 도구를 만들고 있는 중이다.

다른 때는 잘 느끼지 못하는데, 특히나 정규식을 할 때 이런 생각이 든다.

항상 간단한 정규식만을 만들어 사용하다가 이번엔 조금 복잡한 만들게 됐다.

 

까먹지 않고 혹시 나같이 고생하는 사람을 위해...

 

".... LEFT JOIN..... JOIN...." 

다음과 같은 쿼리 문장 중에 JOIN문 앞에서 줄바꿈을 하고 LEFT JOIN의 LEFT 앞에서 줄바꿈을 하려고 했다. 그냥 LEFT JOIN을 줄바꿈+LEFT JOIN으로 바꾸고 JOIN을 줄바꿈+JOIN으로 바꾸면 LEFT JOIN문장은 줄바꿈+LEFT+줄바꿈+JOIN이 된다.

 

그래서 앞에 LEFT나 RIGHT등이 아닌 JOIN문을 찾아 줄바꿈+JOIN으로 바꾸는 방법이다.

물론 C#을 이용해서

 

Regex.Replace(str, @"(?<!LEFT\s+|RIGHT\s+|OUTER\s+)(?<end>JOIN)", String.Format("\r\n{0}", "${end}"))

 

Replace의 첫번째 인자는 source, 두번째는 검색할 내용, 세번째는 바꿀 내용이다.

몇일 고생하며 MSDN 뒤지다가 검색한 예제를 보고 알았다.

 

중요한건 (?<!) ()안의 ?<!뒤에 나오는 내용이 매치되지 않는 스트링을 찾는다는 의미

\s+는 하나 이상의 공백 캐릭터

(?<end>JOIN) 이건 JOIN이고 ?<name>은 name으로 capture해 놓는다는 의미.

capture를 해 두면 뒤쪽 replace에서 capture한 내용을 재 사용할 수 있다.

 

정규식에 대해 전혀 모르는 분은 위의 내용이 무슨 암호로 받아드려지겠지만, 쩝... 정규식 알면 알 수록 신기한 듯 ㅋㅋ