我已经 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/