从 std::string 中删除特定的连续字符重复
Remove specific consecutive characters duplications from std::string
也许任何人都可以有效地删除特定字符的连续重复,最好使用内置的字符串操作,而无需显式地通过字符串字符。
例如,当我有通配符模式并且只想删除连续的星号(*
(
时/aaaa/***/bbbb/ccc/aa/*****/dd --> /aaaa/*/bbbb/ccc/aa/*/dd
对于所有字符重复重复,我可以通过以下方式使用std::unique
:
str.erase( std::unique(str.begin(), str.end()), str.end());
但是只有特定的字符呢。
您可以将相同的算法std::unique
用于 lambda 表达式。
例如
#include <iostream>
#include <string>
#include <functional>
#include <iterator>
#include <algorithm>
int main()
{
std::string s = "/aaaa/***/bbbb/ccc/aa/*****/dd";
char c = '*';
s.erase( std::unique( std::begin( s ), std::end( s ),
[=]( const auto &c1, const auto &c2 ) { return c1 == c && c1 == c2; } ),
std::end( s ) );
std::cout << s << 'n';
}
程序输出为
/aaaa/*/bbbb/ccc/aa/*/dd
或者,您可以删除一组重复字符。例如
#include <iostream>
#include <string>
#include <functional>
#include <iterator>
#include <algorithm>
#include <cstring>
int main()
{
std::string s = "/aaaa/***/bbbb/ccc/aa/*****/dd";
const char *targets = "*b";
auto remove_chars = [=]( const auto &c1, const auto &c2 )
{
return strchr( targets, c1 ) && c1 == c2;
};
s.erase( std::unique( std::begin( s ), std::end( s ), remove_chars ),
std::end( s ) );
std::cout << s << 'n';
}
程序输出为
/aaaa/*/b/ccc/aa/*/dd
在最后一个示例中,我假设字符串中不包含字符' '
。否则,您必须在 lambda 中的逻辑表达式中添加一个子表达式。
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用连续字符及其路径查找矩阵中最长路径的长度
- 使用连续分隔符和空最后一个字符进行拆分
- 从 std::string 中删除特定的连续字符重复
- 将字符串分为连续的非空格字符的序列
- 使用正则表达式为每个连续的大写字符附加'.'
- 查找n连续字符的函数返回true/false
- 将字符串重新排序为没有连续相同字符的字符串
- 如何在2D数组中搜索以确保不超过3个连续字符
- 在整数数据类型和连续两个字符类型之后.第 2 个字符的数据类型跳过..为什么
- 使用Xerces C++过滤连续XML标记之间的格式化字符
- 在内存块中搜索2个连续字符
- 字符数字 ['0'.."9'] 需要具有连续的数值吗?
- std::string是否需要将其字符存储在连续的内存中?< / h1 >
- 在c++中删除字符串中连续重复的字符
- 连续输入字符,如多次使用循环的字符串