13

我想用正则表达式验证 QLineEdit 的文本。它应该允许从 a 到 z 的字符加上 A 到 Z 加上土耳其字符(ğüşöçİĞÜŞÖÇ)加上从 0 到 9 的数字。我搜索了我的问题并找到了两个解决方案,但没有一个对我有用。在一种解决方案中,它说“在正则表达式中包含土耳其字符”,而在另一种解决方案中,它说“使用土耳其字符的 unicode”

下面是两个正则表达式

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

上述任何一个正则表达式都不能验证名称“İSMAİL”。我还尝试了仅包含土耳其语字符的文本('ğüşöçİĞÜŞÖÇ'),但无法验证。当我从两个文本中删除“İ”字符时,它们可以被验证。我猜这个问题可能与“İ”字符有关。

我该如何解决这个问题?

注意:我们在项目中使用的是 Qt 4.6.3。

4

3 回答 3

21

我认为这是一个编码问题。您使用隐式转换 fromconst 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将您的字符串文字转换为QString显式使用 UTF-8:

QRegExp exp = QRegExp(QString::fromUtf8("^[a-zA-Z0-9ğüşöçİĞÜŞÖÇ]+$"));
qDebug() << exp.exactMatch(QString::fromUtf8("İSMAİL")); // <= true
于 2013-06-05T09:03:04.500 回答
2

您可以尝试匹配^\p{L}+$,这是任何字母的简写。

于 2013-06-05T08:16:48.843 回答
1

很可能你需要\w. 它包括任何字符(任何语言)数字和下划线字符。
您可以像这样排除下划线(?!_)\w

于 2013-06-05T12:18:47.540 回答