0

我有两个 QRegExp 对象,用于搜索某些文本的开头和结尾。我的代码看起来像:

// strText defined earlier
QRegExp start(...);
QRegExp end(...);

int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart) + end.matchedLength();

关于这段代码,我有两个问题:

(1) 假设找到了每个正则表达式正在寻找的文本。调用上述代码会在运行时调用以下错误:

TerminalWindow.exe 中 0x66b48b3f 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000004。

如果我将代码更改为以下内容,我会得到同样的错误:

int iStart = start.indexIn(strText);
int iTemp = end.matchedLength();
int iEnd = start.indexIn(strText, iStart) + iTemp;

第二个代码片段中的错误对我来说很有意义,因为内部matchedLength() 可能正在针对尚未分配的对象运行。但是,我不明白为什么我也从第一个代码片段中得到同样的错误。在所有其他条件相同的情况下,操作顺序不是从左到右吗?如果我将代码更改为以下内容,那么我会得到我期望的结果:

// strText defined earlier
QRegExp start(...);
QRegExp end(...);

int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart);
iEnd += end.matchedLength();

(2) 如果我的示例中的 strText 看起来像:

<start>
  stackoverflow is awesome!
</start>
<start>
  I like cake!
</start>
<start>
  Girls are pretty!
</start>

如何编写一个 Qt RegExp 来捕获每个起始元素的内容?就像是:

QRegExp reg("<start>(.*?)</start>");

即使它似乎应该与 POSIX 正则表达式一起使用(我相信这是 Qt 实现的),它也永远不会为我工作。(注意:我知道执行此操作的理想方法是使用 XML/HTML 解析器(我实际上正在解析 HTML),但我现在对正则表达式解决方案感兴趣)。

谢谢!

4

2 回答 2

0

<并且>需要逃脱。尝试:

QRegExp reg("\<start\>(.*?)\</start\>");
于 2012-12-27T15:30:04.047 回答
0

我无法用您的第一个代码片段重现该问题。它在我的 Ubuntu 机器上对我来说很好用。

就您的正则表达式而言,存在一些问题。首先,您使用 是?为了使您的正则表达式不贪婪,但它不适用于Qt. 相反,您必须调用该QRegExp.setMinimal(bool)方法。引用QRegExp 参考文档

非贪心匹配不能应用于单个量词,但可以应用于模式中的所有量词

如果你的字符串是这样的:

'<root>\n<start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start>\n</root>'

那么下面的正则表达式就可以正常工作(在我的 Ubuntu 机器上测试的 PyQt 版本):

QRegExp rx("<start>\n(.*)\n</start>");
rx.setMinimal(true);

现在你所要做的就是循环如下(不完全确定,我不是 C++ 人):

QStringList list;
int pos = 0;  
while ((pos = rx.indexIn(str, pos)) != -1) {
    list << rx.cap(1);
    pos += rx.matchedLength();
}

我看到的第二个问题是,正如您在问题中所说,不应该将正则表达式用于此任务。Qt提供QtXml包含大量用于操作 XML 数据的类的模块。

在您的情况下,您的一种可能性是使用QDomDocument该类。以下 PyQt 代码显示了如何执行此操作:

from PyQt4.QtXml import QDomDocument

mydata = "<root><start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start><start>\nI like girls!\n</start></root>"
document = QDomDocument()
document.setContent(mydata)
root = document.documentElement()
element = root.firstChildElement("start")
while (not element.isNull()):
    value = element.firstChild().nodeValue()
    element = element.nextSiblingElement("start")
    print value

Qt如果您尝试一下,我相信您可以很容易地将其转换为代码。

于 2012-12-27T22:06:36.113 回答