Qt正则表达式中的土耳其语字符

时间:2013-06-05 07:12:01

标签: regex qt turkish

我想用正则表达式验证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。

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)

很可能你需要\wIt includes任何字符(任何语言)数字和下划线字符 您可以像(?!_)\w那样排除下划线。