2013-06-05 14 views
8

QLineEditのテキストを正規表現で検証したいと思います。それはaからzまでの文字とAからZとトルコ語の文字(ğüşöçİĞÜŞÖÇ)と0から9までの数字を許可する必要があります。私の問題について調べて、2つの解決策を見つけましたが、どちらも私のために働いていませんでした。以下はQt正規表現のトルコ文字

は2つのreqular表現

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]+$"); 

どちらも上記reqular式のいずれかを検証することができます一つの解決策では、「正規表現のトルコ文字を含む」と言い、他方ではそれが「トルコ文字のユニコードを使用する」と言います名前「İSMAİL」。 また、トルコ文字( 'ğüşöçİĞÜŞÖÇ')のみを含むテキストを試しましたが、検証することはできません。 両方のテキストから 'İ'文字を削除すると、その文字を検証できます。私は問題が 'İ'文字に関連していると思う。

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

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

+0

オリジナルの提案を見ると、試したすべての正規表現マッチャーで '^ [a-zA-Z0-9ğüşöçİĞÜŞ] + $'がうまく動作します(例:http://www.regex101.com/r/gR2xB2) 。問題はどこにもないと確信していますか? – mart1n

答えて

14

これはエンコードの問題だと思います。 const char*から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エンコーディングでコードを保存して、明示的にUTF-8を使用してQStringにあなたの文字列リテラルを変換するQString::fromUtf8を使用します。

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

私はこのような最初の解決策を試すと、trueを返します: 'QTextCodec :: setCodecForCStrings(QTextCodec :: codecForName(" utf-8 ")); exp.exactMatch( "İSMAİL"); ... 'しかし、このような最初の解決策を試すと、falseを返します。 QString name = ui.txtName-> text(); // text()はもちろん "İSMAİL"を返すexp.exactMatch(name); 'なぜこれが起こりますか? – onurozcelik

+0

これは再現できません。 ''İSMAİL ''を' ui.txtName-> text() 'に置き換えた以外は、すべてが同一であると確信していますか? –

+0

私のテストコードのリンクは次のとおりです:[テストコード](http://db.tt/gwsWbbbD)。私はそれを "İSMAİL"、 "şule"、 "ışık"という言葉でテストし、どれも通過しませんでした。私が間違っているところを教えてください。 – onurozcelik

2

^\p{L}+$と一致すると試すことができます。これは任意の文字の省略形です。

1

は、おそらくあなたは\wを必要としています。 It includes任意の文字(任意の言語)の数字とアンダースコア。
(?!_)\wのようなアンダースコアは除外できます。

+0

\ wはqt 5.7でポーランド文字をサポートしていません – Adam