본문 바로가기
연구관련/연구생활

이런 거 하지 말라고 정규 표현식 있는 거다

by adnoctum 2016. 8. 5.




   뭐냐면, 문자열 처리를, 진리의 C++[각주:1]로 해보자. 




위 코드는 <tag>value</tag>가 한 줄에 있는 xml 형식을 처리하기 위한 코드이다. 어차피 xml 파일 자체도 전부 내가 만들기 때문에 이 경우만을 고려하면 되어서 이렇게 했다. 위는... 만약 정규 표현식을 쓴다면, <(.*?)>(.*?)</\//1> 정도로 하겠지. 이 한 줄이면 되는 것을 C++로, 그것도 예외 처리도 별로 하지 않고 하면 위처럼 지저분해지는 거다, >.<"" 그런데 저것도 그나마 C++이기 때문이고, 만약 C로 한다면 좀 더 지저분해지지 않을까? 하는데, 코드 자체는 간단해서 C로 바꾼다고 해서 크게 늘어 날 것 같진 않다. 위는 MFC를 쓰는 경우이긴 하지만 STL을 써서 해도 많이 바뀌진 않을 것이다, Mid같은 함수를 substr 같은 것으로 바꾸거나, 하는 것을 제외하면. 그러니까, C든 STL을 쓰든 MFC든 결국 정규 표현식을 쓰면 한 줄로 끝낼 수 있는 것이 저렇게 길어진다는 얘기. 


   바꿔 말하면, 정규 표현식을 쓰지 않고 생짜로 parsing 을 하면 저렇게 복잡하고 지저분한 것이 정규 표현식을 사용하면 한 방에 된다는 얘기. 물론, 나도 정규 표현식을 무지막지하게 사용하긴 한다. 펄을 잠깐 할 때도 그렇고, 파이썬과 vi, grep 류의 명령어, 등을 많이 사용하기 때문에. 정규 표현식은 펄을 쓰면서 처음 배워서 종종 펄의 정규 표현식이 편했었는데... 이젠 펄을 하도 오랫동안 안해서 어떤 점이 편했는지도 가물가물하다, ㅎㅎ. C++을 쓰면서도 정규 표현식을 가끔 쓰긴 했다. 물론 tr11 이전에는 boost에 있었기 때문에 boost의 것으로. 


   C++에서는, 그럼에도 불구하고, 정규 표현식을 잘 사용하지 않는 이유는, 역시나 속도 때문이다. 한 1천만 줄에 대해 정규 표현식을 사용하면 저렇게 생짜로 parsing 하는 것과 비교해서 확실히 속도 차이가 난다. 이런 경험을 여러 번 했다. 그 이후에는, 그래서, 어지간해선 C++에선 정규 표현식을 잘 사용하지 않는다. parsing 해야 할 것이 어지간히 복잡하지 않는 이상은 거의 무조건 위처럼 생짜로 하기, ㅎ. 하지만, 역시나, 권장할만한 행동(?)은 아니다, ㅋㅋ. 




  1. 반어적 의미다. 문자열 처리는 C/C++ 로 하는 거 아니다, >.<"" 엄청 지저분해진다. [본문으로]