一些字符串处理函数

template<class T, class I>
bool __startsWith(const std::basic_string<T> &str, const std::basic_string<T> &prefix, bool ignoreCase, I(*fnToLower)(I))
{
	return prefix.size() <= str.size() &&
		(!ignoreCase ? std::equal(prefix.cbegin(), prefix.cend(), str.cbegin())
			: std::equal(prefix.cbegin(), prefix.cend(), str.cbegin(), [&fnToLower](T a, T b)
				{
					return fnToLower((I)a) == fnToLower((I)b);
				}));
}
bool startsWith(const std::string &str, const std::string &prefix, bool ignoreCase)
{
	return __startsWith(str, prefix, ignoreCase, ::tolower);
}
bool startsWith(const std::wstring &str, const std::wstring &prefix, bool ignoreCase)
{
	return __startsWith(str, prefix, ignoreCase, ::towlower);
}
template<class T, class I>
bool __endsWith(const std::basic_string<T> &str, const std::basic_string<T> &suffix, bool ignoreCase, I(*fnToLower)(I))
{
	return suffix.size() <= str.size() &&
		(!ignoreCase ? std::equal(suffix.crbegin(), suffix.crend(), str.crbegin())
			: std::equal(suffix.crbegin(), suffix.crend(), str.crbegin(), [&fnToLower](T a, T b)
				{
					return fnToLower(a) == fnToLower(b);
				}));
}
bool endsWith(const std::string &str, const std::string &suffix, bool ignoreCase)
{
	return __endsWith(str, suffix, ignoreCase, ::tolower);
}
bool endsWith(const std::wstring &str, const std::wstring &suffix, bool ignoreCase)
{
	return __endsWith(str, suffix, ignoreCase, ::towlower);
}
template<class T, class I>
bool __equals(const std::basic_string<T> &str1, const std::basic_string<T> &str2, bool ignoreCase, I(*fnToLower)(I))
{
	if (str1.size() != str2.size())
	{
		return false;
	}
	return (!ignoreCase ? std::equal(str1.cbegin(), str1.cend(), str2.cbegin())
		: std::equal(str1.cbegin(), str1.cend(), str2.cbegin(), [&fnToLower](T a, T b)
			{
				return fnToLower(a) == fnToLower(b);
			}));
}
bool equals(const std::string &str1, const std::string &str2, bool ignoreCase)
{
	return __equals(str1, str2, ignoreCase, ::tolower);
}
bool equals(const std::wstring &str1, const std::wstring &str2, bool ignoreCase)
{
	return __equals(str1, str2, ignoreCase, ::towlower);
}
template<class T>
std::vector<std::basic_string<T>> __split(const std::basic_string<T> &str, const std::basic_string<T> &delimiter)
{
	std::vector<std::basic_string<T>>result;
	size_t pos = 0;
	while (pos != std::basic_string<T>::npos)
	{
		size_t index = str.find(delimiter, pos);
		if (index != std::basic_string<T>::npos)
		{
			result.push_back(str.substr(pos, index - pos));
			pos = index + delimiter.size();
		}
		else
		{
			result.push_back(str.substr(pos));
			pos = index;
		}
	}
	return result;
}
std::vector<std::string> split(const std::string &str, const std::string &delimiter)
{
	return __split(str, delimiter);
}
std::vector<std::wstring> split(const std::wstring &str, const std::wstring &delimiter)
{
	return __split(str, delimiter);
}

 

发表回复