提高::分离开的开头和字符串的结尾空标记 - 这是需要的行为?(boost::split leave

2019-07-29 06:23发布

因为我无法在中找到这样的东西的文档 ,我以为我问在这里。 我有以下程序(C ++ 11):

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

using namespace std;
using namespace boost;

int main () {
    string tmp = " #tag #tag1#tag2  #tag3 ####tag4   ";
    list<iterator_range<string::iterator> > matches;
    split( matches, tmp, is_any_of("\t #"), token_compress_on );

    for( auto match: matches ) {
            cout << "'" << match << "'\n";
    }
}

输出是:

''
'tag'
'tag1'
'tag2'
'tag3'
'tag4'
''

我本来以为在token_compress_on选项删除所有空令牌。 该解决方案是,例如,使用boost::trim_if 。 不过,我想知道,这是升压::分裂的期望的行为,以及为什么发生这种情况?

(克++ 4.6.3,升压1.48)

Answer 1:

该行为是故意的,因为你可以重新创建的字符串(完整的开始和结尾的空格)从拆分版本。 升压不知道是否空白是显著还是不给你(它可能是,因为某些文件格式,例如,可能会迫使前导空格/特定空间计数)。

你应该trim_iftrim你的,如果你需要删除前/后间隔。



Answer 2:

如果eCompress参数设置为token_compress_on ,相邻的分隔合并在一起。 否则,每两个隔板分隔的令牌。

这里

它不会删除只合并它们的标记。



Answer 3:

boost::split始终返回n + 1标记,其中n是输入字符串分隔符号。 所以,当,当你传递一个空字符串返回1个令牌不要感到惊讶。

它的基本原理是很简单的。 试想一下,你正在分析CSV文件。 你需要得到完全相同的数量的元素,无论最后的令牌是否为空。

这是很容易取出空令牌,而不是猜测他们是否应该在结果还是不行。 信用

这种行为类似于蟒蛇

>>> len("".split(','))
1


文章来源: boost::split leaves empty tokens at the beginning and end of string - is this desired behaviour?