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

4

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

我的标记结构是组合<sml数字(一或两个)/>,我的QString是draftMsg。如果我只使用正则表达式,它将起作用。

例如:" 你好<sml7/>" 将被更改为带有标签7的照片的hello。

这是我的代码:

           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 的图像。

我搜索并找到了it。我尝试使用 captureCount() 来保留正则表达式的数字并使用它。

我已经创建了这个函数:

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"而不是两个。

有什么建议可以在我的QString上计算正则表达式吗?


如果你打印 qDebug() << regex.cap(0); qDebug() << regex.cap(1); qDebug() << regex.cap(2);,你会得到什么? - Megasa3
抱歉,这个问题表述不是很清晰易懂。能否请您重新用别的方式表达一下? - Zeks
我想用照片@Zeks替换所有正则表达式。 - Farzan Najipour
1个回答

3

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 & after )更新

我正在使用以下方式使用QString::replace: – afn

QString draftMsg = query.value(0).toString(); QRegExp rx(""); int pos = 0; QStringList list; while ((pos = rx.indexIn(draftMsg, pos)) != -1) { list << rx.cap(1); pos += rx.matchedLength(); } for (int k=0 ; k < list.length() ; ++k) draftMsg.replace(QRegExp(""), ""); – afn

但它不起作用。– afn

在输入字符串 "hello <sml7/><sml1/>" 的情况下,输出为:"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 />");

我正在使用QString::replace,像这样: - Farzan Najipour
QString draftMsg = query.value(0).toString(); QRegExp rx("<sml(\d{1,2})/>"); int pos = 0; QStringList list; while ((pos = rx.indexIn(draftMsg, pos)) != -1) { list << rx.cap(1); pos += rx.matchedLength(); } for (int k=0 ; k < list.length() ; ++k) draftMsg.replace(QRegExp(""), ""); - Farzan Najipour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接