2009-08-09 8 views
11

나는 boost :: tokenizer를 찾았으며 문서가 매우 얇음을 발견했습니다. "돌고래 - 원숭이 - 비비"와 같은 문자열을 토큰 화하고 모든 단어를 토큰으로 만들 수 있으며 모든 이중 대시를 토큰으로 만들 수 있습니까? 예제에서 나는 단 한 문자 구분 기호가 허용되는 것을 보았습니다. 라이브러리가 더 복잡한 구분 기호를 사용하기에 충분하지 않습니까?문자열 구분 기호와 함께 boost :: tokenizer 사용

+1

이이 커뮤니티 위키를 표시하는 이유 그냥 궁금 토크 나이 일반적인 부스트처럼 사용할 수 있습니다 후? –

+0

다른 사람들이 조금 분산되어있는 경우 제 질문을 명확히 할 수 있다고 생각했습니다. 아마도 나는 다음 번엔 그것이 무엇인지에 관해 읽을 것입니다. – Martin

답변

0

원하는대로하려면 TokenizerFunction을 작성해야합니다.

+0

나는 본다. 미리 만들어진 물건이 있기를 바랬지 만 너무 많이하기를 바라고 있었던 것 같습니다. – Martin

1

하나의 옵션은 boost :: regex를 시도하는 것입니다. 맞춤형 토크 나이저와 비교하여 성능이 확실하지 않습니다.

std::string s = "dolphin--monkey--baboon"; 

boost::regex re("[a-z|A-Z]+|--"); 
boost::sregex_token_iterator iter(s.begin(), s.end() , re, 0); 
boost::sregex_token_iterator end_iter; 

while(iter != end_iter) 
{ 
    std::cout << *iter << '\n'; 
    ++iter; 
} 
+0

좋은 소식입니다. 작동하면 내 표가 붙습니다. :) –

10

iter_split을 사용하면 여러 문자 토큰을 사용할 수 있습니다. 아래 코드는 생성 할 것이다 다음

돌고래
월 키
원숭이

#include <iostream> 
#include <boost/foreach.hpp> 
#include <boost/algorithm/string.hpp> 
#include <boost/algorithm/string/iter_find.hpp> 

    // code starts here 
    std::string s = "dolphin--mon-key--baboon"; 
    std::list<std::string> stringList; 
    boost::iter_split(stringList, s, boost::first_finder("--")); 

    BOOST_FOREACH(std::string token, stringList) 
    {  
     std::cout << token << '\n'; ; 
    } 
+1

전체 문자열의 사본을 만드는 단점이 있습니다. 토큰 화 된 문자열이 크면 문제가됩니다. 부스트 토크 나이저는 이것을하지 않습니다. –

2

나는 테마가 꽤 오래 알고 있지만 구글에서 상위 링크에 표시됩니다 I 때

:

그래서 난 단지의 경우, TokenizerFunction 내 변형을 추가합니다 검색 "문자열 토크 나이 강화"

우리가

boost::tokenizer<FindStrTFunc> tok("some input...some other input"); 

을 만들고

+0

구현이 이상적이지 않습니다 (버그가있을 수 있음). 단지 예일뿐입니다. – Alek86

관련 문제