2017-02-18 55 views
2

我通常情況下,拆分文本記號化字符串sregex_token_iterator的情況下,與標題空間

vector<string> split(const string& input, const string& reText) { 
    regex re(reText); 
    sregex_token_iterator first{input.begin(), input.end(), re, -1}, last; 
    return {first, last}; 
} 

auto text = string(" hello world, hi every one"); 
auto delimiters = string("[\\s,]+"); 
auto arr = split(text, delimiters); 
copy(begin(arr), end(arr), ostream_iterator<string>(cout, "\n")); 

使用sregex_token_iterator但是,與標題空間「」的結果是,

{「」,「你好」, 「世界」, 「喜」,每一個」, 「一」}

所以,我通常刪除標題爲 「」 手動空字符串。

if (arr.size() > 0 && arr[0].empty()) arr.erase(arr.begin()); 

有更好的主意嗎?

+0

你可以拆分之前裁剪的字符串。那麼你將不會有前/後空白。 –

回答

1

我在這裏所做的只是更改您的分隔符列表,以便它匹配不包含這些分隔符的一系列字符,然後我更改了您的迭代器以進行匹配而不是匹配。

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

std::vector<std::string> split2(const std::string& input, const std::string& reText) { 
    std::regex re(reText); 
    std::sregex_token_iterator first{input.begin(), input.end(), re, 0}, last; 
    return {first, last}; 
} 

int main() { 
    std::string text = " hello world, hi every one"; 
    std::string delimiters = "[^\\s,]+"; 
    auto arr = split2(text, delimiters); 
    for(const auto& s : arr) { 
     std::cout << '"' << s << "\"\n"; 
    } 
} 

輸出:

"hello" 
"world" 
"hi" 
"every" 
"one"