Qt -如何在QString中定义正则表达式

Qt - how to define regular expression in QString

本文关键字:定义 正则表达式 QString Qt      更新时间:2023-10-16

我在Qt正则表达式上工作过,我想用图像替换所有特定正则表达式的子字符串。

我的标签结构是<, sml, digits (one or two)/>的组合,我的QString是draftMsg。如果我使用正则表达式一次,它将工作。

例如:"hello <sml7/> "将在我的目录中更改为hello and photo with label 7。

下面是我的代码:
           QRegExp rxlen("<sml(\d{1,2})/>");
           if (draftMsg.contains(rxlen))
           {
                QString str = rxlen.capturedTexts()[1];
                int index = str.toInt();
                smileyClicked(index-1);
                m_messageEdit->insertHtml(QString("<img src=":images/smiley/%1_64.png" width=%2 />")
                                          .arg(index, 2, 10, QLatin1Char('0')).arg(smileyWidth));
                draftMsg = draftMsg.remove(rxlen);
           } 

实际上,当我写字符串时,它错误地替换为:"hello <sml7/><sml1/> "。它将用标签7替换这两个标签。

我找了,我找到了。我试图使用captucount()来保留正则表达式的数字并使用它。

我创建了这个函数:

void MessageDialog::regInMessage(QString pattern, QString string)
{
    QRegExp regex(pattern);
    if (regex.indexIn(string) < 0) {
        qDebug("Can't find a match.");
        return;
    }
    qDebug() << regex.captureCount();
}

但是它给我的是"1"而不是"2"。

任何建议计数正则表达式在我的QString?

Capture -是一个字符串,匹配括号内的表达式。在您的正则表达式<sml(\d{1,2})/>中只有一个括号对,因此captureCount返回1。为了在字符串中处理正则表达式的所有入口,您需要做这样的事情(来自Qt的帮助示例):

 QRegExp rx("(\d+)");
 QString str = "Offsets: 12 14 99 231 7";
 QStringList list;
 int pos = 0;
 while ((pos = rx.indexIn(str, pos)) != -1) {
     list << rx.cap(1);
     pos += rx.matchedLength();
 }
 // list: ["12", "14", "99", "231", "7"]

另外,如果你想替换一个字符串,一个好主意是使用QString &QString::replace (const QRegExp &rx, const QString &之后)。

我使用QString::替换像这样:- afn

QString draftMsg = query.value(0).toString();QRegExprx (" ");Int pos = 0;QStringList列表;While ((pos = .rx。indexIn(draftMsg, pos)) != -1) {list <<rx.cap (1);pos + =rx.matchedLength ();} for (int k=0;k & lt;list.length ();+ + k)draftMsg.replace (QRegExp ("), ");——afn

但不工作- afn

使用你的代码。

In: "hello <sml7/><sml1/>"

Out: "hello <img src=":images/smiley/7.png" width=%2 /><img src=":images/smiley/1.png" width=%2 />"

你期望得到什么?

同样,所有这些代码都可以修改为:

QString draftMsg = query.value(0).toString();
draftMsg.replace(QRegExp("<sml(\d{1,2})/>")
                 , "<img src=":images/smiley/\1.png" width=%2 />");