Jos*_*eph 2 c++ regex 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经使用这个工具在线测试了正则表达式.使用给定的正则表达式字符串和<span style="foo">Bar</span>工具的示例文本说它应该在字符串中找到正则表达式.但是,在我的Qt代码中,我永远不会进入我的while循环.
我以前从未用过Qt或任何其他语言的正则表达式.有人能提供一些帮助吗?谢谢!
[edit]所以我发现errorString()如果正则表达式无效,QRegExp有一个函数可以使用.我输出这个并看到:"糟糕的重复语法".不太确定这意味着什么.当然,谷歌搜索"糟糕的重复语法"提出了...这篇文章.该死的谷歌,你快.
Ant*_*sky 11
问题是QRegExp只支持贪婪的量词.更确切地说,它支持无论是贪婪还是勉强量词,但不能同时.因此,<span(.*?)>无效,因为没有*?运算符.相反,你可以使用
QRegExp rx("<span(.*)>");
rx.setMinimal(true);
Run Code Online (Sandbox Code Playgroud)
这会给每一个 *,+以及?在QRegExp行为*?,+?和??分别,而不是它们的默认行为.您可能会或可能不会意识到,差异是最小版本匹配尽可能少的字符,而不是尽可能多.
在这种情况下,您也可以写
QRegExp rx("<span([^>]*)>");
Run Code Online (Sandbox Code Playgroud)
这可能是我要做的,因为它具有相同的效果:匹配直到你看到一个>.你的更通用,是的(如果你有一个多字符的结尾标记),但我认为这在简单的情况下稍微好一些.当然,要么会工作.
另外,要非常小心地使用正则表达式解析HTML.你不能真正做到这一点,并且识别标签是 - 虽然(我相信)可能 - 比这更难.(评论,CDATA块和处理说明在工作中引起了轰动.)如果您知道您正在查看的数据类型,这可能是一个可接受的解决方案; 即使这样,我也会考虑使用HTML解析器.