8

我必须检查特定字符串是否以另一个字符串开头。字符串使用 utf8 编码,比较应该不区分大小写。

我知道这与C++ 中不区分大小写的字符串比较主题非常相似,但我不想使用 boost 库,我更喜欢可移植的解决方案(如果“几乎”不可能,我更喜欢面向 Linux 的解决方案)。

是否可以在 C++11 中使用其正则表达式库?或者只是使用简单的字符串比较方法?

4

3 回答 3

13

我知道的唯一方法是 UTF8/internationalization/culture-aware 是优秀且维护良好的IBM ICU: International Components for Unicode。它是一个用于 *nix 或 Windows 的 C/C++ 库,已经进行了大量研究以提供一个文化感知字符串库,包括既快速又准确的不区分大小写的字符串比较。

恕我直言,除非你在写论文,否则你永远不应该自己写的两件事是加密和文化敏感的字符串库。

于 2012-05-04T07:38:13.410 回答
3

您要查找的字符串中的内容是否有任何限制?它是用户输入,可以是任何 UTF-8 字符串,问题非常复杂。正如其他人所提到的,一个字符可以有几种不同的表示形式,因此您可能必须首先对字符串进行规范化。然后:什么是平等的?应该'E'比较等于'é'(在法语的某些圈子中通常是这样),或者不等于(这将符合 Imprimerie nationale 的“官方”规则)。

对于除了最琐碎的定义之外的所有定义,滚动您自己的定义将代表一项重大的努力。对于这类事情,图书馆 ICU 是参考。它包含您需要的一切。但是请注意,它适用于 UTF16,而不是 UTF8,因此您必须先转换字符串,并对其进行规范化。(ICU 对两者都有支持。)

于 2012-05-04T08:02:14.457 回答
2

使用 stl 正则表达式类,您可以执行类似以下代码段的操作。不幸的是它不是utf8。更改str2std::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;
}
于 2012-05-04T07:57:45.423 回答