2
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 代码中,我从来没有进入我的 while 循环。

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

[编辑] 所以我刚刚发现 QRegExp 有一个函数errorString()可以在正则表达式无效时使用。我输出这个并看到:“错误的重复语法”。不太清楚这意味着什么。当然,谷歌搜索“错误的重复语法”会带来......这篇文章。该死的谷歌,你快。

4

2 回答 2

11

问题是QRegExp只支持贪心量词。更准确地说,它支持贪婪情愿的量词,但不能同时支持两者。因此,<span(.*?)>无效,因为没有*?运算符。相反,您可以使用

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

这将分别给出每个 *、和+、 和?QRegExp行为*?,而不是它们的默认行为。您可能知道或可能不知道的区别在于,最小版本匹配尽可能少的字符,而不是尽可能的 .+???

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

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

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

此外,在使用正则表达式解析 HTML 时要非常非常小心。你实际上做不到,识别标签——虽然(我相信)是可能的——比这要困难得多。(评论、CDATA 块和处理指令会影响工作。)如果您知道您正在查看的数据类型,这可能是一个可以接受的解决方案;即便如此,我还是会改用 HTML 解析器。

于 2010-12-22T08:18:59.323 回答
1

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

<span[^>]*>

可能是最简单的。

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

于 2010-12-22T08:15:46.770 回答