8

特定の文字列が別の文字列で始まっているかどうかを確認する必要があります。文字列は utf8 を使用してエンコードされ、比較では大文字と小文字が区別されません。

これはC++ での Case insensitive string comparisonというトピックに非常に似ていることはわかっていますが、boost ライブラリは使用したくなく、移植可能なソリューションを好みます (「ほぼ」不可能な場合は、Linux 指向のソリューションを好みます)。

正規表現ライブラリを使用してC++ 11で可能ですか? それとも単純な文字列比較メソッドを使用していますか?

4

3 に答える 3

13

私が知っている唯一の方法は、UTF8/国際化/文化に対応していることであり、優れたよく管理された IBM ICU: International Components for Unicodeです。これは *nix または Windows 用の C/C++ ライブラリであり、大文字と小文字を区別しない高速で正確な文字列比較など、文化を意識した文字列ライブラリを提供するために多くの研究が行われています。

私見ですが、論文を書いている場合を除き、自分で書いてはいけない 2 つのことは、暗号化とカルチャに依存する文字列ライブラリです。

于 2012-05-04T07:38:13.410 に答える
3

探している文字列に含まれるものに制限はありますか? それはユーザー入力であり、任意の UTF-8 文字列である可能性があり、問題は非常に複雑です。他の人が述べたように、1 つの文字は複数の異なる表現を持つことができるため、おそらく最初に文字列を正規化する必要があります。次に、何が等しいと見なされますか? 等しいか (フランス語の一部のサークルでは通常のように)、または等しくないか ( Imprimerie nationale の「公式」ルールに準拠します) を'E'比較する必要があります。'é'

最も些細な定義を除いて、独自の定義を展開することはかなりの労力を意味します。こういうのは図書館のICUが参考になります。必要なものがすべて含まれています。ただし、UTF8 ではなく UTF16 で機能するため、最初に文字列を変換し、正規化する必要があることに注意してください。(ICU では両方をサポートしています。)

于 2012-05-04T08:02:14.457 に答える
2

stl 正規表現クラスを使用すると、次のスニペットのようなことができます。残念ながらutf8ではありません。に変更str2するstd::wstring str2 = L"hello World"と、多くの変換警告が表示されます。std::regex はwhar入力を許可していないため (私が見る限り)、作成はまったく機能しませんstr1std::wchar

#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 に答える