我必须检查特定字符串是否以另一个字符串开头。字符串使用 utf8 编码,比较应该不区分大小写。
我知道这与C++ 中不区分大小写的字符串比较主题非常相似,但我不想使用 boost 库,我更喜欢可移植的解决方案(如果“几乎”不可能,我更喜欢面向 Linux 的解决方案)。
是否可以在 C++11 中使用其正则表达式库?或者只是使用简单的字符串比较方法?
我必须检查特定字符串是否以另一个字符串开头。字符串使用 utf8 编码,比较应该不区分大小写。
我知道这与C++ 中不区分大小写的字符串比较主题非常相似,但我不想使用 boost 库,我更喜欢可移植的解决方案(如果“几乎”不可能,我更喜欢面向 Linux 的解决方案)。
是否可以在 C++11 中使用其正则表达式库?或者只是使用简单的字符串比较方法?
我知道的唯一方法是 UTF8/internationalization/culture-aware 是优秀且维护良好的IBM ICU: International Components for Unicode。它是一个用于 *nix 或 Windows 的 C/C++ 库,已经进行了大量研究以提供一个文化感知字符串库,包括既快速又准确的不区分大小写的字符串比较。
恕我直言,除非你在写论文,否则你永远不应该自己写的两件事是加密和文化敏感的字符串库。
您要查找的字符串中的内容是否有任何限制?它是用户输入,可以是任何 UTF-8 字符串,问题非常复杂。正如其他人所提到的,一个字符可以有几种不同的表示形式,因此您可能必须首先对字符串进行规范化。然后:什么是平等的?应该'E'
比较等于'é'
(在法语的某些圈子中通常是这样),或者不等于(这将符合 Imprimerie nationale 的“官方”规则)。
对于除了最琐碎的定义之外的所有定义,滚动您自己的定义将代表一项重大的努力。对于这类事情,图书馆 ICU 是参考。它包含您需要的一切。但是请注意,它适用于 UTF16,而不是 UTF8,因此您必须先转换字符串,并对其进行规范化。(ICU 对两者都有支持。)
使用 stl 正则表达式类,您可以执行类似以下代码段的操作。不幸的是它不是utf8。更改str2
为std::wstring str2 = L"hello World"
会导致大量转换警告。制作str1
一个std::wchar
根本不起作用,因为 std::regex 不允许 whar 输入(据我所知)。
#include <regex>
#include <iostream>
#include <string>
int main()
{
//The input strings
std::string str1 = "Hello";
std::string str2 = "hello World";
//Define the regular expression using case-insensitivity
std::regex regx(str1, std::regex_constants::icase);
//Only search at the beginning
std::regex_constants::match_flag_type fl = std::regex_constants::match_continuous;
//display some output
std::cout << std::boolalpha << std::regex_search(str2.begin(), str2.end(), regx, fl) << std::endl;
return 0;
}