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

z9ju0rcb  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(186)

我想用一个正则表达式来验证QLineEdit的文本。它应该允许从a到z加上A到Z加上土耳其语字符(üşöçÜŠÖ)加上从0到9的数字。我在谷歌上搜索了我的问题,找到了两个解决方案,但都不适合我。在一个解决方案中,它说“在regexp中包含土耳其语字符”,在另一个解决方案中,它说“使用土耳其语字符的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]+$");

上面的两个正则表达式都不能验证名称SMAL。我还尝试了一个只包含土耳其字符的文本(üşöçÜŠÖ),但它不能被验证。当我从这两个文本中删除""字符时,它们可以被验证。我猜问题可能与“”字符有关。
我怎样才能解决这个问题?
注:我们在项目中使用Qt 4.6.3。

66bbxpm5

66bbxpm51#

我认为这是一个编码问题。你使用了从const char*QString的隐式转换,这导致使用QString::fromAscii。如果你想在这里使用非Latin 1编码,你需要调用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
tktrz96b

tktrz96b2#

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

uajslkp6

uajslkp63#

最有可能的是你需要\w。它包括任何字符(任何语言)数字和下划线字符。
您可以排除(?!_)\w之类下划线。

vi4fp9gy

vi4fp9gy4#

你可能想试试这个?

QRegExp exp = QRegExp("[^ -~^ı^Ü^ü^Ö^ö^Ç^ç^Ş^ş]");

它基本上忽略文本中从空格到波浪号的任何字符(几乎所有可打印字符)
此外,它还忽略了文本中的其他字符,我们发现在土耳其字母表。(ö,ç,ü,▷)。
因此,这个表达式捕获的都是土耳其语文本中不可打印的字符;你可以在文本中用“?”来代替它们。
希望能帮上忙!
祝你好运

相关问题