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

时间:2010-12-22 07:59:15

标签: 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);
    }
}

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

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

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

2 个答案:

答案 0 :(得分:11)

问题是QRegExp仅支持贪婪量词。更确切地说,it supports either greedy or reluctant quantifiers, but not both。因此,<span(.*?)>无效,因为没有*?运算符。相反,您可以使用

QRegExp rx("<span(.*)>");
rx.setMinimal(true);

这将{em} *+? QRegExp行为*?,{{分别是1}}和+?,而不是默认行为。正如您可能或可能不知道的那样,差异是最小版本匹配为少数字符,而不是许多

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

??

这可能是我要做的,因为它具有相同的效果:匹配直到看到QRegExp rx("<span([^>]*)>"); 。你的更通用,是的(如果你有一个多字符的结尾标记),但我认为这在简单的情况下稍微好一些。当然,要么都可以。

此外,be very, very careful about parsing HTML with regular expressions。你不能真正做到这一点,并且识别标签是 - 虽然(我相信)可能 - 比这更难。 (评论,CDATA块和处理说明在工作中引起了轰动。)如果您知道您正在查看的数据类型,这可能是一个可接受的解决方案;即使这样,我也会考虑使用HTML解析器。

答案 1 :(得分:1)

你想要达到什么目的?如果要删除开始标记及其元素,则使用模式

<span[^>]*>

可能是最简单的。

语法。*?表示广泛支持的非贪婪匹配,但可能会混淆QT正则表达式引擎。