发新帖

[C/VC/C++] 字符串处理

零下一度 2019-9-26 917

转载地址: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);
	}
}


最新回复 (0)
返回
零下一度
主题数
928
帖子数
0
注册排名
1