我必须从网站解析特定的HTML代码。以下是其中的一部分:
<div class="_ss">
<div class="info">
First info.
</div>
<div class="info">
Second info.
</div>
<div class="info">
Third info.
</div>
</div>
我已经定义了正则表达式如下:
QRegExp rx("<div class=\"info\">(.+)</div>");
它当前匹配所有块,但匹配的文本包括所有后续块。例如,在Second
的情况下,它返回:
<div class="info">
Second info.
</div>
<div class="info">
Third info.
</div>
</div>
我想我可以将?
添加到我的正则表达式中以获得计划结果:
QRegExp rx("<div class=\"info\">(.+?)</div>");
但是,使用此正则表达式根本不会产生匹配。
答案 0 :(得分:1)
我浏览了the regex docs of Qt。跳转到quantifiers section,似乎没有办法使你的量词懒惰/不同于perl风格的正则表达式,你可以在量词之后添加?
。阅读量词部分中的注释,您似乎需要使用setMinimal()
。
以下是代码示例:
QString str = "<div class=\"_ss\">\
<div class=\"info\">\
First info.\
</div>\
<div class=\"info\">\
Second info.\
</div>\
<div class=\"info\">\
Third info.\
</div>\
</div>"; // Some input
QStringList list;
int pos = 0;
QRegExp rx("<div class=\"info\">(.+)</div>");
rx.setMinimal(true); // Make our regex lazy/ungreedy
// Looping through our matches
while((pos = rx.indexIn(str, pos)) != -1){
list << rx.cap(1); // Add group 1 to our list
pos += rx.matchedLength();
}
// Looping and printing
for(pos = 0;pos < list.size();pos++){
std::cout << list.at(pos).toStdString() << std::endl;
}
注意:您可能需要修剪结果,因为还包含空格。