C++:寻找一种简洁的解决方案,用特定字符替换 std::string 中的一组字符

Posted

技术标签:

【中文标题】C++:寻找一种简洁的解决方案,用特定字符替换 std::string 中的一组字符【英文标题】:C++: Looking for a concise solution to replace a set of characters in a std::string with a specific character 【发布时间】:2009-08-12 23:58:23 【问题描述】:

假设我有以下:

std::string some_string = "2009-06-27 17:44:59.027";

问题是:给出将 some_string 中所有“-”和“:”实例替换为空格的代码,即“”

我正在寻找一个简单的单班轮(如果可能的话)

可以使用Boost。

【问题讨论】:

【参考方案1】:
replace_if( some_string.begin(), some_string.end(), boost::bind( ispunct<char>, _1, locale() ), ' ' );

一行而不是 n^2 运行时间或调用正则表达式引擎 ;v) ,虽然你需要为此提升有点难过。

【讨论】:

请注意,这将替换所有标点符号,而不仅仅是“:”和“-”。 ispunct&lt;char&gt; 应替换为执行指定操作的函数。 替换( some_string.begin(), some_string.end(), ':', ' ' );替换( some_string.begin(), some_string.end(), '-', ' ' ); +1 表示关于 n^2 运行时间和/或使用正则表达式引擎获取其他答案的注释。我知道考虑性能是过时的,但如果一个人不关心性能,他们为什么要操心 C++?【参考方案2】:

Boost 有一个似乎不为人知的字符串算法库:

String Algorithm Quick Reference

有一个基于正则表达式的替换版本,类似于帖子 1,但我发现find_format_all 的性能更好。这是一个单行启动:

find_format_all(some_string,token_finder(is_any_of("-:")),const_formatter(" "));

【讨论】:

【参考方案3】:

您可以使用 Boost 正则表达式来做到这一点。像这样的:

e = boost::regex("[-:]");
some_string = regex_replace(some_string, e, " ");

【讨论】:

【参考方案4】:

我会这样写:

for (string::iterator p = some_string.begin(); p != some_string.end(); ++p) 
    if ((*p == '-') || (*p == ':')) 
        *p = ' ';
    

不是一个简洁的单行代码,但我很确定它第一次就可以正常工作,没有人会在理解它时遇到任何困难,并且编译器可能会生成接近最佳的目标代码。

【讨论】:

【参考方案5】:

来自http://www.cppreference.com/wiki/string/find_first_of

string some_string = "2009-06-27 17:44:59.027";
size_type found = 0;
while ((found = str.find_first_of("-:", found)) != string::npos) 
    some_string[found] = ' ';

【讨论】:

【参考方案6】:
replace_if(str.begin(), str.end(), [&](char c) -> bool
    if (c == '-' || c == '.')
        return true;
    else 
        return false;
, ' ');

这是使用 c++ox 的 1 班轮。如果不使用仿函数。

replace_if(str.begin(), str.end(), CanReplace, ' ');

typedef string::iterator 迭代器;

bool CanReplace(char t) if (t == '.' || t == '-') 返回真; 别的 返回假;

【讨论】:

以上是关于C++:寻找一种简洁的解决方案,用特定字符替换 std::string 中的一组字符的主要内容,如果未能解决你的问题,请参考以下文章

用 ascii 连字符“-”替换所有连字符类型

自动替换字符串流中的字符

用StringBuffer替换特定位置字符

Bash 字符串删除特定字符

替换出现在两个特定单词之间的一组字符串的所有出现

用特定逻辑替换字符串中的字符