转载地址:https://github.com/offscum/tinyToolkit/blob/dev/project/tinyToolkit/utilities/string.cpp
/**
*
* 作者: hm
*
* 说明: 字符串处理
*
*/
#include "string.h"
namespace tinyToolkit
{
/**
*
* 去除首尾字符
*
* @param value 待处理字符串
* @param group 处理字符集
*
*/
void String::Trim(std::string & value, const char * group)
{
assert(group);
std::string::size_type end = value.find_last_not_of(group);
std::string::size_type start = value.find_first_not_of(group);
value = (start == std::string::npos) ? "" : value.substr(start, 1 + end - start);
}
/**
*
* 去除首尾字符
*
* @param value 待处理字符串
* @param group 处理字符集
*
* @return 处理后字符串
*
*/
std::string String::Trim(const std::string & value, const char * group)
{
assert(group);
std::string::size_type end = value.find_last_not_of(group);
std::string::size_type start = value.find_first_not_of(group);
return (start == std::string::npos) ? "" : value.substr(start, 1 + end - start);
}
/**
*
* 转换小写
*
* @param value 待处理字符串
* @param index 偏移位置
*
*/
void String::Lower(std::string & value, std::size_t index)
{
std::transform(value.begin() + index, value.end(), value.begin() + index, ::tolower);
}
/**
*
* 转换小写
*
* @param value 待处理字符串
* @param index 偏移位置
*
* @return 处理后字符串
*
*/
std::string String::Lower(const std::string & value, std::size_t index)
{
std::string str = value;
Lower(str, index);
return str;
}
/**
*
* 转换大写
*
* @param value 待处理字符串
* @param index 偏移位置
*
*/
void String::Upper(std::string & value, std::size_t index)
{
std::transform(value.begin() + index, value.end(), value.begin() + index, ::toupper);
}
/**
*
* 转换大写
*
* @param value 待处理字符串
* @param index 偏移位置
*
* @return 处理后字符串
*
*/
std::string String::Upper(const std::string & value, std::size_t index)
{
std::string str = value;
Upper(str, index);
return str;
}
/**
*
* 删除字符串指定字符
*
* @param value 待查找的字符串
* @param key 被查找的字符串
* @param index 偏移位置
*
*/
void String::Erase(std::string & value, char key, std::size_t index)
{
while ((index = value.find(key, index)) != std::string::npos)
{
value.erase(index, 1);
}
}
/**
*
* 删除字符串指定字符
*
* @param value 待查找的字符串
* @param key 被查找的字符串
* @param index 偏移位置
*
* @return 处理后字符串
*
*/
std::string String::Erase(const std::string & value, char key, std::size_t index)
{
std::string str = value;
Erase(str, key, index);
return str;
}
/**
*
* 删除字符串指定字符
*
* @param value 待查找的字符串
* @param key 被查找的字符串
* @param index 偏移位置
*
*/
void String::Erase(std::string & value, const std::string & key, std::size_t index)
{
while ((index = value.find(key, index)) != std::string::npos)
{
value.erase(index, key.size());
}
}
/**
*
* 删除字符串指定字符
*
* @param value 待查找的字符串
* @param key 被查找的字符串
* @param index 偏移位置
*
* @return 处理后字符串
*
*/
std::string String::Erase(const std::string & value, const std::string & key, std::size_t index)
{
std::string str = value;
Erase(str, key, index);
return str;
}
/**
*
* 删除字符串指定字符
*
* @param value 待处理字符串
* @param function 判断函数
* @param index 偏移位置
*
*/
void String::Erase(std::string & value, const std::function<bool(char)> & function, std::size_t index)
{
for (auto iter = value.begin() + index; iter != value.end();)
{
if (function(*iter))
{
value.erase(iter, iter + 1);
}
else
{
++iter;
}
}
}
/**
*
* 删除字符串指定字符
*
* @param value 待处理字符串
* @param function 判断函数
* @param index 偏移位置
*
* @return 处理后字符串
*
*/
std::string String::Erase(const std::string & value, const std::function<bool(char)> & function, std::size_t index)
{
std::string str = value;
Erase(str, function, index);
return str;
}
/**
*
* 字符串替换字符
*
* @param value 待处理字符串
* @param src 被替换字符串
* @param dst 待替换字符串
* @param index 偏移位置
*
*/
void String::Replace(std::string & value, const std::string & src, const std::string & dst, std::size_t index)
{
for (std::size_t pos = index; pos != std::string::npos; pos += dst.size())
{
if ((pos = value.find(src, pos)) == std::string::npos)
{
break;
}
else
{
value.replace(pos, src.size(), dst);
}
}
}
/**
*
* 字符串替换字符
*
* @param value 待处理字符串
* @param src 被替换字符串
* @param dst 待替换字符串
* @param index 偏移位置
*
* @return 处理后字符串
*
*/
std::string String::Replace(const std::string & value, const std::string & src, const std::string & dst, std::size_t index)
{
std::string str = value;
Replace(str, src, dst, index);
return str;
}
/**
*
* 字符串替换字符
*
* @param value 待处理字符串
* @param src 被替换字符串
* @param dst 待替换字符串
* @param index 偏移位置
*
*/
void String::ReplaceAll(std::string & value, const std::string & src, const std::string & dst, std::size_t index)
{
while (true)
{
std::size_t pos = value.find(src, index);
if (pos == std::string::npos)
{
break;
}
else
{
value.replace(pos, src.size(), dst);
}
}
}
/**
*
* 字符串替换字符
*
* @param value 待处理字符串
* @param src 被替换字符串
* @param dst 待替换字符串
* @param index 偏移位置
*
* @return 处理后字符串
*
*/
std::string String::ReplaceAll(const std::string & value, const std::string & src, const std::string & dst, std::size_t index)
{
std::string str = value;
ReplaceAll(str, src, dst, index);
return str;
}
/**
*
* 是否包含被查找的字符
*
* @param value 待查找字符串
* @param infix 被查找字符
* @param index 偏移位置
*
* @return 查找结果
*
*/
bool String::With(const char * value, char infix, std::size_t index)
{
assert(value);
return std::strchr(value + index, infix) != nullptr;
}
/**
*
* 是否包含被查找的字符串
*
* @param value 待查找字符串
* @param infix 被查找字符串
* @param index 偏移位置
*
* @return 查找结果
*
*/
bool String::With(const char * value, const char * infix, std::size_t index)
{
assert(value && infix);
return strstr(value + index, infix) != nullptr;
}
/**
*
* 是否包含被查找的字符
*
* @param value 待查找字符串
* @param infix 被查找字符
* @param index 偏移位置
*
* @return 查找结果
*
*/
bool String::With(const std::string & value, char infix, std::size_t index)
{
return value.find(infix, index) != std::string::npos;
}
/**
*
* 是否包含被查找的字符串
*
* @param value 待查找字符串
* @param infix 被查找字符串
* @param index 偏移位置
*
* @return 查找结果
*
*/
bool String::With(const std::string & value, const char * infix, std::size_t index)
{
assert(infix);
return value.find(infix, index) != std::string::npos;
}
/**
*
* 是否包含被查找的字符串
*
* @param value 待查找字符串
* @param infix 被查找字符串
* @param index 偏移位置
*
* @return 查找结果
*
*/
bool String::With(const std::string & value, const std::string & infix, std::size_t index)
{
return value.find(infix, index) != std::string::npos;
}
/**
*
* 是否以字符串结尾
*
* @param value 待查找字符串
* @param prefix 被查找字符串
*
* @return 查找结果
*
*/
bool String::EndWith(const std::string & value, const std::string & suffix)
{
return value.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), value.rbegin());
}
/**
*
* 是否字符串开头
*
* @param value 待查找字符串
* @param prefix 被查找字符串
*
* @return 查找结果
*
*/
bool String::StartWith(const std::string & value, const std::string & prefix)
{
return value.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), value.begin());
}
/**
*
* 按字符串拆分
*
* @param value 待查找字符串
* @param key 被查找字符串
* @param container 结果容器
* @param keepEmpty 是否保留空串
*
* @return 拆分个数
*
*/
std::size_t String::Split(const std::string & value, const std::string & key, std::vector<std::string> & container, bool keepEmpty)
{
if (key.empty())
{
container.push_back(value);
}
else
{
std::string::const_iterator beg = value.begin();
std::string::const_iterator end;
while (true)
{
end = std::search(beg, value.end(), key.begin(), key.end());
if (beg != end)
{
std::string str(beg, end);
Trim(str, "\r\n");
if (keepEmpty || !str.empty())
{
container.push_back(str);
}
if (end == value.end())
{
break;
}
}
else if (beg == value.end())
{
break;
}
beg = end + key.size();
}
}
return container.size();
}
/**
*
* 按字符串拆分
*
* @param value 待查找字符串
* @param key 被查找字符串
* @param keepEmpty 是否保留空串
*
* @return 结果容器
*
*/
std::vector<std::string> String::Split(const std::string & value, const std::string & key, bool keepEmpty)
{
std::vector<std::string> container;
Split(value, key, container, keepEmpty);
return container;
}
/**
*
* 按行拆分
*
* @param value 待查找字符串
* @param container 结果容器
* @param keepEnter 是否保留换行符
*
* @return 拆分的个数
*
*/
std::size_t String::SplitLines(const std::string & value, std::vector<std::string> & container, bool keepEnter)
{
std::size_t i = 0;
std::size_t j = 0;
while (i < value.size())
{
while (i < value.size() && value[i] != '\r' && value[i] != '\n' && value[i] != '\0')
{
++i;
}
std::size_t eol = i;
if (i < value.size())
{
i += (value[i] == '\r' && i + 1 < value.size() && value[i + 1] == '\n') ? 2 : 1;
if (keepEnter)
{
eol = i;
}
}
container.push_back(value.substr(j, eol - j));
j = i;
}
return container.size();
}
/**
*
* 按行拆分
*
* @param value 待查找字符串
* @param keepEmpty 是否保留换行符
*
* @return 结果容器
*
*/
std::vector<std::string> String::SplitLines(const std::string & value, bool keepEnter)
{
std::vector<std::string> container;
SplitLines(value, container, keepEnter);
return container;
}
/**
*
* 过滤注释
*
* @param value 待过滤数据
*
* @return 过滤后数据
*
*/
std::string String::FilterNote(const std::string & value)
{
enum class State : uint8_t
{
NORMAL, /// 正常代码
SLASH, /// 斜杠
NOTE_MULTI_LINE, /// 多行注释
NOTE_MULTI_LINE_STAR, /// 多行注释遇到*
NOTE_SINGLE_LINE, /// 单行注释
BACKSLASH, /// 折行注释反斜线
CHARACTER, /// 字符
ESCAPE_CHARACTER, /// 字符中的转义字符
STRING, /// 字符串
ESCAPE_STRING /// 字符串中的转义字符
};
std::string str{ };
State state = State::NORMAL;
for (const char c : value)
{
switch (state)
{
case State::NORMAL: /// 正常代码
{
if (c == '/')
{
state = State::SLASH;
}
else
{
str.push_back(c);
if (c == '\'')
{
state = State::CHARACTER;
}
else if (c == '\"')
{
state = State::STRING;
}
else
{
state = State::NORMAL; /// 保持当前状态
}
}
break;
}
case State::SLASH: /// 斜杠
{
if (c == '*')
{
state = State::NOTE_MULTI_LINE;
}
else if (c == '/')
{
state = State::NOTE_SINGLE_LINE;
}
else
{
str.push_back('/');
str.push_back(c);
state = State::NORMAL;
}
break;
}
case State::NOTE_MULTI_LINE: /// 多行注释
{
if (c == '*')
{
state = State::NOTE_MULTI_LINE_STAR;
}
else
{
state = State::NOTE_MULTI_LINE; /// 保持当前状态
}
break;
}
case State::NOTE_MULTI_LINE_STAR: /// 多行注释遇到*
{
if (c == '/')
{
state = State::NORMAL; /// 注释结束
}
else if (c == '*')
{
state = State::NOTE_MULTI_LINE_STAR; /// 保持当前状态
}
else
{
state = State::NOTE_MULTI_LINE;
}
break;
}
case State::NOTE_SINGLE_LINE: /// 单行注释
{
if (c == '\\')
{
state = State::BACKSLASH;
}
else if (c == '\r' || c == '\n')
{
str.push_back(c);
state = State::NORMAL; /// 注释结束
}
else
{
state = State::NOTE_SINGLE_LINE; /// 保持当前状态
}
break;
}
case State::BACKSLASH: /// 折行注释反斜线
{
if (c == '\\' || c == '\r' || c == '\n')
{
state = State::BACKSLASH; /// 保持当前状态
}
else
{
state = State::NOTE_SINGLE_LINE;
}
break;
}
case State::CHARACTER: /// 字符
{
str.push_back(c);
if (c == '\\')
{
state = State::ESCAPE_CHARACTER;
}
else if (c == '\'')
{
state = State::NORMAL;
}
else
{
state = State::CHARACTER; /// 保持当前状态
}
break;
}
case State::ESCAPE_CHARACTER: /// 字符中的转义字符
{
str.push_back(c);
state = State::CHARACTER;
break;
}
case State::STRING: /// 字符串
{
str.push_back(c);
if (c == '\\')
{
state = State::ESCAPE_STRING;
}
else if (c == '\"')
{
state = State::NORMAL;
}
else
{
state = State::STRING; /// 保持当前状态
}
break;
}
case State::ESCAPE_STRING: /// 字符串中的转义字符
{
str.push_back(c);
state = State::STRING;
break;
}
default:
{
break;
}
}
}
return str;
}
/**
*
* 转换16进制字符串
*
* @param value 待转换字符串
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string String::AsHexString(const char * value, bool reverse)
{
assert(value);
return AsHexString(value, strlen(value), reverse);
}
/**
*
* 转换16进制字符串
*
* @param value 待转换字符串
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string String::AsHexString(const uint8_t * value, bool reverse)
{
assert(value);
return AsHexString(value, strlen(reinterpret_cast<const char *>(value)), reverse);
}
/**
*
* 转换16进制字符串
*
* @param value 待转换字符串
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string String::AsHexString(const std::string & value, bool reverse)
{
return AsHexString(value, value.size(), reverse);
}
/**
*
* 转换16进制字符串
*
* @param value 待转换字符串
* @param size 转换长度
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string String::AsHexString(const char * value, std::size_t size, bool reverse)
{
assert(value);
return AsHexString(reinterpret_cast<const uint8_t *>(value), size, reverse);
}
/**
*
* 转换16进制字符串
*
* @param value 待转换字符串
* @param size 转换长度
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string String::AsHexString(const uint8_t * value, std::size_t size, bool reverse)
{
assert(value);
int64_t op = reverse ? -1 : 1;
int64_t init = reverse ? static_cast<int64_t>(size) - 1 : 0;
int64_t end = reverse ? -1 : static_cast<int64_t>(size);
std::ostringstream stream{ };
for (int64_t i = init; i != end; i += op)
{
stream << fmt::format("{:02x}", value[i]);
}
return stream.str();
}
/**
*
* 转换16进制字符串
*
* @param value 待转换字符串
* @param size 转换的长度
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string String::AsHexString(const std::string & value, std::size_t size, bool reverse)
{
return AsHexString(value.c_str(), size, reverse);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* 转换字符
*
* @param value 待转换字符串
*
* @return 转换后字符
*
*/
uint8_t HexString::AsByte(const char * value)
{
return static_cast<uint8_t>(strtol(value, nullptr, 16));
}
/**
*
* 转换字符
*
* @param value 待转换字符串
*
* @return 转换后字符
*
*/
uint8_t HexString::AsByte(const std::string & value)
{
return AsByte(value.c_str());
}
/**
*
* 转换字符串
*
* @param value 待转换字符串
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string HexString::AsString(const char * value, bool reverse)
{
assert(value);
return AsString(value, strlen(value), reverse);
}
/**
*
* 转换字符串
*
* @param value 待转换字符串
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string HexString::AsString(const std::string & value, bool reverse)
{
return AsString(value, value.size(), reverse);
}
/**
*
* 转换字符串
*
* @param value 待转换字符串
* @param size 字符串长度
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string HexString::AsString(const char * value, std::size_t size, bool reverse)
{
int64_t op = reverse ? -2 : 2;
int64_t init = reverse ? static_cast<int64_t>(size) - 2 : 0;
int64_t end = reverse ? -2 : static_cast<int64_t>(size);
std::string tempStr;
for (int64_t i = init; i != end; i += op)
{
char buffer[3] = { value[i], value[i + 1], '\0' };
tempStr.push_back(AsByte(buffer));
}
return tempStr;
}
/**
*
* 转换字符串
*
* @param value 待转换字符串
* @param size 字符串长度
* @param reverse 是否反向转换
*
* @return 转换后字符串
*
*/
std::string HexString::AsString(const std::string & value, std::size_t size, bool reverse)
{
return AsString(value.c_str(), size, reverse);
}
}
|
|---|