2016-08-15 295 views
-1

我想分割任何出現的字符串andC++將整個字符串拆分爲另一個字符串

首先我必須說清楚,我不打算使用任何regex作爲分隔符。

我運行下面的代碼:

#include <iostream> 
#include <regex> 
#include <boost/algorithm/string.hpp> 

int main() 
{ 
    std::vector<std::string> results; 
    std::string text= 
     "Alexievich, Svetlana and Lindahl,Tomas and Campbell,William"; 
    boost::split(
     results, 
     text, 
     boost::is_any_of(" and "), 
     boost::token_compress_off 
     ); 
    for(auto result:results) 
    { 
     std::cout<<result<<"\n"; 
    } 
    return 0; 
} 

,其結果是從不同的我所期望的:

Alexievich, 
Svetl 







Li 


hl,Tom 
s 




C 
mpbell,Willi 
m 

它單獨似乎定界符行爲的每一個字符,而我需要有整個and作爲分隔符。

請不要鏈接到this boost example,除非您確定它可以用於我的情況。

+2

這就是'is_any_of'的意思,它與*字符串中的任何*字符匹配。第三個參數是* predicate *,這意味着它可以是任何可調用的對象,包括lambda。另一個問題是['boost :: split'](http://www.boost.org/doc/libs/1_61_0/doc/html/boost/algorithm/split_idp205739088.html)似乎是基於* character *的,而不是「單詞」的基礎。 –

+0

@JoachimPileborg,謝謝你的評論。要替換什麼? – jeremine

回答

0

老式的方式:

#include <iostream> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::vector<std::string> results; 
    std::string text= 
     "Alexievich, Svetlana and Lindahl,Tomas and Campbell,William"; 
    size_t pos = 0; 
    for (;;) { 
     size_t next = text.find("and", pos); 
     results.push_back(text.substr(pos, next - pos)); 
     if (next == std::string::npos) break; 
     pos = next + 3; 
    } 

    for(auto result:results) 
    { 
     std::cout<<result<<"\n"; 
    } 
    return 0; 
} 

包裝成一個可重用的功能就留給讀者自己練習。

+0

如果掃描的文本包含「Copeland,Amit」...,您將「包含」和「」分開。 –

+0

如果find()失敗,那麼調用'substr(pos,npos-pos)' –

+0

@DavidThomas Re:contains「and」時會出錯。問題陳述中沒有任何內容表明該計劃不應該分裂。猜測的OP:*「我想分割一個字符串**任何**出現的'和'。」*(強調我的)Re:'substr' - 不,我沒有錯誤。該程序實際上預計最終會調用'substr(pos,npos-pos)',並且它工作得很好。 –

1

<algorithm>包含搜索 - 此任務的正確工具。

vector<string> results; 
const string text{ "Alexievich, Svetlana and Lindahl,Tomas and Campbell,William" }; 
const string delim{ " and " }; 
for (auto p = cbegin(text); p != cend(text);) { 
    const auto n = search(p, cend(text), cbegin(delim), cend(delim)); 
    results.emplace_back(p, n); 
    p = n; 
    if (cend(text) != n) // we found delim, skip over it. 
     p += delim.length(); 
} 
相關問題