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

标签 c++ regex qt

我已经 worked关于 Qt 的正则表达式,我想用图像替换所有具有特定正则表达式的子字符串。

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

例如:“hello <sml7/> ”将在我的目录中更改为 hello 和带有标签 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 的图像。

我搜索并找到了 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 上的正则表达式吗?

最佳答案

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 ) .

更新

I'm using QString::replace like this: – 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

but it doesn't work – 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 />");

关于c++ - Qt - 如何在 QString 中定义正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31560921/

相关文章:

c++ - 寻找特定的 C++ 技术

c++ - 文件读取问题

c# - 匹配 HTML id 的正则表达式

linux - i.MX6 上的 Qt 5.3.2 使用 Yocto : problems with QML WebView

c++ - QString 的 toHtmlEscaped 不起作用

c++ - 开源 C++ 数据可视化库

c# - 将带有参数的 c# 回调方法传递给 c++ dll 会导致 System.ExecutionEngineException

java正则表达式匹配文件路径

java正则表达式模式分割逗号

qt - Qt中setVisible、setShown和show/hide之间有什么区别