13

QLineEdit のテキストを正規表現で検証したい。a から z までの文字と、A から Z までの文字、およびトルコ文字 (ğüşöçİĞÜŞÖÇ) と 0 から 9 までの数字を許可する必要があります。ある解決策では「トルコ語の文字を正規表現に含める」とあり、別の解決策では「トルコ語の文字のユニコードを使用する」とあります

以下は2つの正規表現です

QRegExp exp = QRegExp("^[a-zA-Z0-9ğüşöçİĞÜŞÖÇ]+$");

QRegExp exp = QRegExp("^[a-zA-Z0-9\u00E7\u011F\u0131\u015F\u00F6\u00FC\u00C7\u011E\u0130\u015E\u00D6\u00DC]+$");

上記の正規表現のいずれも、「İSMAİL」という名前を検証できません。また、トルコ語の文字 ('ğüşöçİĞÜŞÖÇ') のみを含むテキストを試しましたが、検証できません。両方のテキストから「İ」文字を削除すると、検証できます。問題は「İ」文字に関連している可能性があると思います。

どうすれば問題を解決できますか?

注: プロジェクトでは Qt 4.6.3 を使用しています。

4

3 に答える 3

21

これはエンコードの問題だと思います。const char*fromへの暗黙のキャストを使用するQStringと、結果として が使用されQString::fromAsciiます。ここで非 Latin1 エンコーディングを使用する場合はQTextCodec::setCodecForCStrings、ソース ファイルが保存されているエンコーディングを呼び出して設定する必要があります。ここでは UTF-8 エンコーディングを使用するので、アプリの初期化時に次のように行う必要があります。

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QRegExp exp = QRegExp("^[a-zA-Z0-9ğüşöçİĞÜŞÖÇ]+$");
qDebug() << exp.exactMatch("İSMAİL"); // <= true

問題がここにあるかどうかを確認するためのより明確な解決策をお勧めします。コードを UTF-8 エンコーディングで保存しQString::fromUtf8、文字列リテラルをQString明示的に UTF-8を使用するように変換するために使用します。

QRegExp exp = QRegExp(QString::fromUtf8("^[a-zA-Z0-9ğüşöçİĞÜŞÖÇ]+$"));
qDebug() << exp.exactMatch(QString::fromUtf8("İSMAİL")); // <= true
于 2013-06-05T09:03:04.500 に答える
1

おそらく必要です\wこれには、任意の文字 (任意の言語) の数字とアンダースコア文字が含まれます。
そのようにアンダースコアを除外できます(?!_)\w

于 2013-06-05T12:18:47.540 に答える