【问题标题】:Tokenize string using sregex_token_iterator in case with heading space在有标题空间的情况下使用 sregex_token_iterator 标记字符串
【发布时间】:2017-07-07 17:32:49
【问题描述】:

我通常使用 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"));

但是,标题空格“”的结果是,

{"", "hello", "world", "hi", every", "one" }

所以,我通常手动删除标题“”空字符串。

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

有更好的主意吗?

【问题讨论】:

  • 您可以在拆分之前修剪字符串。这样你就不会有前导/尾随空格了。

标签: c++ token


【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多