【问题标题】:Qt - how to define regular expression in QStringQt - 如何在 QString 中定义正则表达式
【发布时间】:2015-07-22 10:46:51
【问题描述】:

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

我的标签结构是<smldigits (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 &lt;sml7/&gt;&lt;sml1/&gt;”。它会将两个标签都替换为带有标签 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() &lt;&lt; regex.cap(0); qDebug() &lt;&lt; regex.cap(1);qDebug() &lt;&lt; regex.cap(2);会得到什么??
  • 恐怕这个问题没有以一种可以理解的方式表达。能改一下吗?
  • 我想用照片@Zeks替换所有正则表达式

标签: c++ regex qt


【解决方案1】:

Capture - 是一个字符串,匹配括号内的表达式。在您的正则表达式 &lt;sml(\\d{1,2})/&gt; 中只有一对括号,因此 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();正则表达式 rx("");整数位置 = 0; QStringList 列表;而((位置= rx.indexIn(draftMsg, pos)) != -1) { list

但它不起作用 - afn

使用了你的代码。

在:"hello &lt;sml7/&gt;&lt;sml1/&gt;"

输出:"hello &lt;img src=":images/smiley/7.png" width=%2 /&gt;&lt;img src=":images/smiley/1.png" width=%2 /&gt;"

你期望得到什么?

此外,所有这些代码都可以更改为:

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

【讨论】:

  • 我正在使用 QString::replace 像这样:
  • QString DraftMsg = query.value(0).toString(); QRegExp rx("");整数位置 = 0; QStringList 列表; while ((pos = rx.indexIn(draftMsg, pos)) != -1) { list "), "");
猜你喜欢
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2013-11-18
相关资源
最近更新 更多