티스토리 뷰


Boost의 Regex를 쓰다가 헤멘 부분이 있다. 표준의 <regex>코드를 수정하지 않고도 네임스페이스만 지정하는 걸로도 완벽 호환이었다. 괜히 가져다 도입했다고 말한 것이 아니었군 ㄷㄷ


근데, 언어 표준이 있음에도 굳이 Boost를 쓴 이유는, 표준은 PCRE를 지원 안 하고, 그런 주제에 속도는 느리더라. MSVC2013기준이다.

느릴 이유가 있는지 의문이다. 혹시 누군가 이유를 알면 덧글로 알려주실 수 있으신지.


잡설은 이만 줄이고, 본론.


                const char *  card_li   { "<li class=\"card_unit(.|\\n)*?</li>" };
                boost:: regex card_item { card_li };

                boost:: regex card_id   { "[A-Z]{2}/\\S+" };

                auto li_begin = boost::sregex_iterator (text.begin(), text.end(), card_item);
                auto li_end   = boost::sregex_iterator ();
                for (auto & li = li_begin; li != li_end; ++li)
                {
                                string id, name, cost;
                                boost:: smatch match;

                                if (boost::regex_search(li->str(), match, card_id))
                                {
                                                id = match[0].str();
                                }
                }

코드의 일부분을 발췌했을 뿐이므로, 컴파일러같이 text가 정의되지 않았고 name, cost가 사용되지 않았다는 문제점은 패스.

이 코드에서 문제점과 이유를 발견할 수 있다면, 아마 볼 필요가 없을 것이다. regex라이브러리에 익숙한 분이라고 생각한다. 하지만 나는 그렇지 않았지;;


문제점을 알려주자면, 저 id에 값이 제대로 할당되지 않는다.


이유인 즉슨, li->str()이 임시변수고, match는 그 임시변수의 반복자만 가지고있기 때문에 임시변수가 소멸하는 순간 같이 쓰레기가 되어버린다. 보통 match에다 값을 복사할 거라고 생각하지만, 아니었다. 이 편이 효율이 좋긴 하지만, 이렇다는 사실을 모르면 고통이 되어버린다.


당근 해결책은 string같은 변수에다 할당해주고 쓰면 된다.


그리고 Boost와 얼마나 차이점이 있는지 잘 모를 표준의 regex도 마찬가지다.


하.. 이거 하나 잡으려고 얼마나 허비한 건지. GC의 편리함을 다시 체감하게 된다.


비야네 할아버지도 '설마 C++을 가장 좋아하진 않겠죠?' 라고 말할 정도의 언어라... 근데 언매니지드 환경에선 딱히 이거 말고 쓸 게 없지 않나. 언어가 없단 건 아니지만.


regex 인코딩 깨짐같은 키워드로 구글링하다가 시간만 허비했다.

regex_search함수 내에선 값이 정상적인데, 함수가 끝나자마자 값이 이상해지니, 그제서야 의심할 수 있게 된 것이다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함