2013-06-05 12 views
8

Voglio convalidare il testo di QLineEdit con un'espressione regolare. Dovrebbe consentire i caratteri dalla A alla Z più dalla A alla Z più i caratteri turchi (ğüşöçİĞÜŞÖÇ) più i numeri da 0 a 9. Ho cercato su Google il mio problema e ho trovato due soluzioni, ma nessuna ha funzionato per me. In una soluzione si dice "includere caratteri turchi in regexp" e in altro si dice "uso unicodes di personaggi turchi"Qt Caratteri turchi nelle espressioni regolari

Qui di seguito sono due espressioni 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]+$"); 

nessuno di espressioni reqular sopra può convalidare il chiama "İSMAİL". Ho anche provato un testo che contiene solo caratteri turchi ('ğüşöçİĞÜŞÖÇ') ma non può essere convalidato. Quando rimuovo il carattere 'İ' da entrambi i testi, possono essere convalidati. Immagino che il problema possa essere correlato al carattere "İ".

Come posso risolvere il problema?

Nota: nel nostro progetto utilizziamo Qt 4.6.3.

+0

Osservando il tuo suggerimento originale, '^ [a-zA-Z0-9ğüööçİĞÜŞÖÇ] + $' funziona bene per me in tutti i regex matcher che ho provato (ad esempio: http://www.regex101.com/r/gR2xB2) . Sei sicuro che il problema non sia altrove? – mart1n

risposta

14

Penso che questo sia un problema di codifica. Si utilizza il cast implicito da const char* a QString che risulta utilizzando QString::fromAscii. Se si desidera utilizzare la codifica non Latin1 qui, è necessario chiamare QTextCodec::setCodecForCStrings e impostare la codifica in cui i file di origine vengono salvati. Io uso la codifica UTF-8, quindi all'atto dell'inizializzazione dell'app dovrebbe essere fatto in questo modo:

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

Suggerisco una soluzione più chiara per verificare se il problema è qui. Salvare il codice in codifica UTF-8 e utilizzare QString::fromUtf8 per convertire le vostre stringhe letterali di QString usando UTF-8 in modo esplicito:

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

Quando provo la tua prima soluzione in questo modo restituisce true: 'QTextCodec :: setCodecForCStrings (QTextCodec :: codecForName (" utf-8 ")); exp.exactMatch ("İSMAİL"); ... 'Ma quando provo la tua prima soluzione in questo modo restituisce false:' QTextCodec :: setCodecForCStrings (QTextCodec :: codecForName ("utf-8")); QString name = ui.txtName-> text(); // text() restituisce "İSMAİL" ovviamente exp.exactMatch (nome); "Perché questo accade? – onurozcelik

+0

Non riesco a riprodurre questo. Sei sicuro che tutto sia identico ad eccezione di '" İSMAİL "' sostituito in 'ui.txtName-> text()'? –

+0

Ecco il link del mio codice di test: [Test code] (http://db.tt/gwsWbbbD). L'ho provato con le parole "İSMAİL", "şule", "ışık" e nessuno di loro passa. Dimmi dove sto sbagliando. – onurozcelik

2

Si potrebbe provare l'abbinamento ^\p{L}+$, che è la scorciatoia per qualsiasi lettera.

1

molto probabilmente è necessario \w. It includes qualsiasi carattere (qualsiasi lingua) cifre e carattere di sottolineatura.
È possibile escludere il trattino basso come quello (?!_)\w.

+0

\ w non supporta le lettere di smalto in qt 5.7 – Adam

Problemi correlati