需要在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);
}
}
我已经在线测试了正则表达式 这个工具. 。带有给定的正则字符串和一个示例文本 <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引擎感到困惑。