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

时间:2015-07-22 10:46:51

标签: c++ regex qt

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

我的代码结构是const int i = 1776; const float f = i; <smldigits (one or two)的组合,我的QString是/>。如果我使用正则表达式,它将起作用。

例如:“ hello draftMsg ”将在我的目录中更改为hello和带有标签7的照片。

这是我的代码:

<sml7/>

实际上,当我写下字符串时,它会被错误地替换:“ 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); } ”。它将用标签7替换两个标签到图像。

我搜索了一下,发现it。我试图使用captureCount()来保持正则表达式的数字并使用它。

我已经创建了这个功能:

<sml7/><sml1/>

但它给了我“1”而不是两个。

有关在我的QString上计算正则表达式的建议吗?

1 个答案:

答案 0 :(得分:1)

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列表;而((pos =   rx.indexIn(draftMsg,pos))!= -1){list&lt;&lt; rx.cap(1); pos + =   rx.matchedLength(); } for(int k = 0; k&lt; 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 />");