正则表达式无法按计划运行

时间:2014-11-17 17:34:18

标签: regex qt

我必须从网站解析特定的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>");

但是,使用此正则表达式根本不会产生匹配。

1 个答案:

答案 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;
}

注意:您可能需要修剪结果,因为还包含空格。