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()
。我输出这个并看到:“糟糕的重复语法”。不太确定这意味着什么。当然,谷歌搜索“糟糕的重复语法”提出了...这篇文章。该死的谷歌,你快。
答案 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正则表达式引擎。