需要帮助Qt中的正则表达式(QRegExp)[重复语法错误?]

Jos*_*eph 2 c++ regex qt qregexp

void MainWindow::whatever(){
    QRegExp rx ("<span(.*?)>");
    //QString line = ui->txtNet1->toHtml();
    QString line = "<span>Bar</span><span style='baz'>foo</span>";
    while(line.contains(rx)){
        qDebug()<<"Found rx!";
        line.remove (rx);
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经使用这个工具在线测试了正则表达式.使用给定的正则表达式字符串和<span style="foo">Bar</span>工具的示例文本说它应该在字符串中找到正则表达式.但是,在我的Qt代码中,我永远不会进入我的while循环.

我以前从未用过Qt或任何其他语言的正则表达式.有人能提供一些帮助吗?谢谢!

[edit]所以我发现errorString()如果正则表达式无效,QRegExp有一个函数可以使用.我输出这个并看到:"糟糕的重复语法".不太确定这意味着什么.当然,谷歌搜索"糟糕的重复语法"提出了...这篇文章.该死的谷歌,你快.

Ant*_*sky 11

问题是QRegExp只支持贪婪的量词.更确切地说,它支持无论是贪婪还是勉强量词,但不能同时.因此,<span(.*?)>无效,因为没有*?运算符.相反,你可以使用

QRegExp rx("<span(.*)>");
rx.setMinimal(true);
Run Code Online (Sandbox Code Playgroud)

这会给每一个 *,+以及?QRegExp行为*?,+???分别,而不是它们的默认行为.您可能会或可能不会意识到,差异是最小版本匹配尽可能少的字符,而不是尽可能.

在这种情况下,您也可以写

QRegExp rx("<span([^>]*)>");
Run Code Online (Sandbox Code Playgroud)

这可能是我要做的,因为它具有相同的效果:匹配直到你看到一个>.你的更通用,是的(如果你有一个多字符的结尾标记),但我认为这在简单的情况下稍微好一些.当然,要么会工作.

另外,要非常小心地使用正则表达式解析HTML.你不能真正做到这一点,并且识别标签是 - 虽然(我相信)可能 - 比这更难.(评论,CDATA块和处理说明在工作中引起了轰动.)如果您知道您正在查看的数据类型,这可能是一个可接受的解决方案; 即使这样,我也会考虑使用HTML解析器.