2010-12-22 48 views
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); 
    } 
} 

我已经使用this tool在线测试了正则表达式。使用给定的正则表达式字符串和<span style="foo">Bar</span>的示例文本,该工具说它应该在字符串中找到正则表达式。然而,在我的Qt代码中,我永远不会进入我的while循环。需要Qt中正则表达式的帮助(QRegExp)[错误重复语法?]

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

所以我刚发现QRegExp有一个函数errorString()用于在正则表达式无效的情况下使用。我输出这个并看到:“坏的重复语法”。不确定这意味着什么。当然,搜索“糟糕的重复语法”会带来......这篇文章。该死的谷歌,你快。

+0

啊。 HTML和正则表达式!立即阅读http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454! – Macke 2010-12-22 08:20:50

回答

11

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

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

这会给*+,并且?QRegExp*?+???,分别是行为,而不是它们的默认行为。所不同的,因为你可能会或可能不知道,是最小的版本匹配为几个角色成为可能,而不是许多。直到你看到一个>比赛:

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

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

这可能是我会做什么,因为它具有相同的效果。你的是更一般的,是的(如果你有一个多字符结束标记),但我认为这在简单的情况下稍微好一些。当然,两者都可以工作。

此外,be very, very careful about parsing HTML with regular expressions。你实际上做不到,识别标签是 - 虽然(我相信)可能 - 比这更难。 (注释,CDATA模块和处理指令在工作中会引发一些问题。)如果您知道您正在查看的数据类型,这可能是一个可以接受的解决方案;即使如此,我也会查看HTML解析器。

+0

额外的+1链接到史诗般的HTML正则表达式答案。 :) – Macke 2010-12-22 08:21:18

1

你想达到什么目的?如果你想删除开始标记及其内容,那么该模式

<span[^>]*> 

可能是最简单的。

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