我想用正则表达式验证QLineEdit的文本。它应该允许从a到z的字符加上A到Z加上土耳其字符(ğüşöçİĞÜŞÖÇ)以及0到9之间的数字。我搜索了我的问题并找到了两个解决方案,但两个都没有为我工作。在一个解决方案中它说“在regexp中包含土耳其字符”,在另一个解决方案中它说“使用土耳其字符的unicodes”
以下是两个需要的表达式
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 :(得分:15)
我认为这是编码问题。您使用从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编码保存代码,并使用QString::fromUtf8
明确地使用UTF-8将字符串文字转换为QString
:
QRegExp exp = QRegExp(QString::fromUtf8("^[a-zA-Z0-9ğüşöçİĞÜŞÖÇ]+$"));
qDebug() << exp.exactMatch(QString::fromUtf8("İSMAİL")); // <= true
答案 1 :(得分:2)
您可以尝试匹配^\p{L}+$
,这是任何字母的简写。
答案 2 :(得分:1)
很可能你需要\w
。 It includes任何字符(任何语言)数字和下划线字符
您可以像(?!_)\w
那样排除下划线。