Boost::Split 使用整个字符串作为分隔符

Posted

技术标签:

【中文标题】Boost::Split 使用整个字符串作为分隔符【英文标题】:Boost::Split using whole string as delimiter 【发布时间】:2011-09-15 20:17:55 【问题描述】:

我想知道是否有一种方法使用 boost::split 来拆分字符串,使用整个字符串作为分隔符。例如:

str = "xxaxxxxabcxxxxbxxxcxxx"

有没有一种方法可以使用"abc" 作为分隔符来分割这个字符串?因此返回:

结果将是字符串 "xxaxxxx""xxxxbxxxcxxx"

我知道boost::split 使用"is_any_of" 谓词,但是调用is_any_of("abc") 会导致字符串拆分为单个字符“a”、“b”和“c”,这不是我想要什么。

【问题讨论】:

您应该能够使用equals 和用作分隔符的字符串值的某种组合,但具体细节现在不知道。 Split on substring 的可能重复项 【参考方案1】:

是的,有一种方法(这是我知道的一种方法,也许有更好的方法)使用boost::algorithm::split_regex 来拆分分隔符为正则表达式的字符序列。

例子:

vector< string > result;
boost::algorithm::split_regex( result, str, regex( "^((?!abc)*abc(?!abc)*)*$" ) ) ;
copy( result.begin(), result.end(), ostream_iterator<string>( cout, "\n" ) ) ;

【讨论】:

谢谢,这个解决方案有效,但它需要构建提升。目前我只使用头文件。 #include 【参考方案2】:

@Mythli 建议的split_regex 很好。如果您不想处理正则表达式,可以使用ifind_all 算法,如example 所示。您收到所有出现的分隔符的iterator_range(开始/结束)。您的标记位于它们之间(以及字符串的开头和结尾)。

【讨论】:

谢谢,这个解决方案非常适合我的需求。【参考方案3】:

如果您知道您的输入字符串由哪些字符组成(例如,一个简单的英文句子,只有 EN 字符),您可以用一个 special_symbol 包围您的 word_delimiter,用它替换所有出现的单词分隔符并用 special_symbol 分割.

例如,我在这里使用了'%':

std::vector<std::string> sentence_parts;
boost::replace_all(sentence, word, "%" + word_delimiter + "%");
boost::split(sentence_parts, sentence, boost::is_any_of("%"));

您需要确保您的输入字符串中永远不会有特殊符号,否则将无法正常工作!

【讨论】:

为什么这比 Mythli 已经描述的更直接的方法更可取? 这不一定是可取的,这是另一种方法。就个人而言,我不喜欢处理正则表达式...

以上是关于Boost::Split 使用整个字符串作为分隔符的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分为具有多个分隔符的多个字符串而不删除?

关于 boost::iter_split 文档

编译时带有 boost::split 的警告[重复]

正则表达式作为explode()中的分隔符

使用单个字符或仅一个字符串来提升拆分

提高拆分使用率