2013-06-05 22 views
8

Chcę zweryfikować tekst QLineEdit za pomocą wyrażenia regularnego. Powinno zezwalać na znaki od a do z plus A do Z plus tureckie postacie (ğüşöçİĞÜŞÖÇ) plus cyfry od 0 do 9. Przeszukiwałem mój problem i znalazłem dwa rozwiązania, ale żaden z nich nie działał dla mnie. W jednym rozwiązaniu mówi „zawierać znaki tureckie w regexp”, aw drugim mówi „Używaj kody Unicode znaków Turecka”Qt Tureckie znaki w wyrażeniach regularnych

Poniżej są dwa wyrażenia 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]+$"); 

żadne z wyrażeń reqular powyżej może sprawdzić nazwa "İSMAİL". Próbowałem również, że tekst zawiera tylko znaki tureckie ("ğüşöçİĞÜŞÖÇ"), ale nie można go zweryfikować. Po usunięciu znaku "İ" z obu tekstów można je zweryfikować. Myślę, że problem może być związany z charakterem "İ".

Jak mogę rozwiązać problem?

Uwaga: W naszym projekcie używamy Qt 4.6.3.

+0

Patrząc na twoją pierwotną sugestię, '^ [a-zA-Z0-9ğüşöçİĞÜŞÖÇ] + $' działa dobrze dla mnie we wszystkich wyrażeń próbnych regex, które wypróbowałem (eg: http://www.regex101.com/r/gR2xB2) . Jesteś pewien, że problem nie jest gdzie indziej? – mart1n

Odpowiedz

14

Myślę, że jest to problem z kodowaniem. Korzystasz z niejawnej obsady od const char* do QString, co skutkuje użyciem QString::fromAscii. Jeśli chcesz użyć tutaj kodowania innego niż Latin1, musisz zadzwonić pod numer QTextCodec::setCodecForCStrings i ustawić kodowanie, w którym zapisywane są twoje pliki źródłowe. Używałbym kodowania UTF-8, więc przy inicjalizacji aplikacji powinno być zrobione w ten sposób:

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

Proponuję bardziej przejrzyste rozwiązanie, aby sprawdzić, czy problem jest tutaj. Zapisz swój kod w UTF-8 i używać QString::fromUtf8 konwertować napisowych do QString użyciu UTF-8 wyraźnie:

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

Kiedy próbuję twoje pierwsze rozwiązanie w ten sposób, zwraca true: 'QTextCodec :: setCodecForCStrings (QTextCodec :: codecForName (" utf-8 ")); exp.exactMatch ("İSMAİL"); ... 'Ale kiedy próbuję twoje pierwsze rozwiązanie w ten sposób zwraca false:' QTextCodec :: setCodecForCStrings (QTextCodec :: codecForName ("utf-8")); QString name = ui.txtName-> text(); // text() zwraca "İSMAİL" oczywiście exp.exactMatch (name); 'Dlaczego tak się dzieje? – onurozcelik

+0

Nie mogę tego odtworzyć. Czy jesteś pewien, że wszystko jest identyczne, z wyjątkiem '' İSMAİL "' zamienionym na 'ui.txtName-> text()'? –

+0

Oto link mojego kodu testowego: [Kod testowy] (http://db.tt/gwsWbbbD). Testowałem to słowami "İSMAİL", "şule", "ışık" i żadne z nich nie przechodzi. Powiedz mi, gdzie robię źle. – onurozcelik

2

Możesz spróbować dopasować ^\p{L}+$, który jest skrótem dla każdej litery.

1

najprawdopodobniej trzeba \w. It includes dowolny znak (dowolny język) cyfr i znak podkreślenia.
Można wykluczyć takie podkreślenie, jak (?!_)\w.

+0

\ w nie obsługuje polskich liter w qt 5.7 – Adam

Powiązane problemy