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);
    }
}

我已经在线测试了正则表达式 这个工具. 。带有给定的正则字符串和一个示例文本 <span style="foo">Bar</span> 该工具说该正则表达式应在字符串中找到。但是,在我的QT代码中,我从来没有进入我的循环。

我以前从未使用过QT或任何其他语言。有人可以提供帮助吗?谢谢!

编辑]所以我刚刚发现qregexp有一个函数 errorString() 如果正则无效,请使用。我输出此信息,然后看到:“不良重复语法”。不确定这意味着什么。当然,谷歌搜索“不良重复语法”会提出...这篇文章。该死的Google,您快。

有帮助吗?

解决方案

问题是 QRegExp 仅支持贪婪的量词。更确切地说, 它支持 任何一个 贪婪的 或者 不情愿的量词,但不是两者. 。因此, <span(.*?)> 无效,因为没有 *? 操作员。相反,您可以使用

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

这将给予 每一个 *, +, , 和 ? 在里面 QRegExp 行为 *?, +?, , 和 ??, ,分别而不是他们的默认行为。您可能知道或可能不知道的区别在于,最小版本与 很少 字符尽可能,而不是 许多.

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

QRegExp rx("<span([^>]*)>");

这可能是我要做的,因为它具有相同的效果:匹配直到看到一个 >. 。您的是更一般的,是的(如果您有多个字符的结尾令牌),但是我认为在简单的情况下,这有点更好。当然,这两个都会起作用。

还, 对用正则表达式解析HTML非常非常小心. 。您实际上不能做到这一点,并且识别标签是(我相信)可能的,比这更难。 (评论,CDATA块和处理指令在作品中抛出了一把扳手。)如果您知道要查看的数据种类,那么这可能是一个可接受的解决方案;即便如此,我还是要研究HTML解析器。

其他提示

您想实现什么?如果要删除开放标签及其元素,则图案

<span[^>]*>

可能是最简单的。

语法。*?表示广泛支持的非绿色匹配项,但可能会使QT Regex引擎感到困惑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top