Qt';s QRegExp和方法顺序
我有两个QRegExp对象,用于搜索某些文本的开始和结束。我的代码看起来像:Qt';s QRegExp和方法顺序,regex,qt,Regex,Qt,我有两个QRegExp对象,用于搜索某些文本的开始和结束。我的代码看起来像: // strText defined earlier QRegExp start(...); QRegExp end(...); int iStart = start.indexIn(strText); int iEnd = end.indexIn(strText, iStart) + end.matchedLength(); <start> stackoverflow is awesome! &l
// strText defined earlier
QRegExp start(...);
QRegExp end(...);
int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart) + end.matchedLength();
<start>
stackoverflow is awesome!
</start>
<start>
I like cake!
</start>
<start>
Girls are pretty!
</start>
QRegExp reg("<start>(.*?)</start>");
'<root>\n<start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start>\n</root>'
关于此代码,我有两个问题:
(1) 假设找到了每个正则表达式要查找的文本。调用上述代码会在运行时调用以下错误:
TerminalWindow.exe中0x66b48b3f处未处理的异常:0xC0000005:访问冲突读取位置0x00000004
如果我将代码更改为:
int iStart = start.indexIn(strText);
int iTemp = end.matchedLength();
int iEnd = start.indexIn(strText, iStart) + iTemp;
第二个代码段中的错误对我来说很有意义,因为Internal matchedLength()可能是针对尚未分配的对象运行的。然而,我不明白为什么我也会从第一个代码片段中得到同样的错误。在所有其他条件相同的情况下,操作顺序不是从左到右吗?如果我将代码更改为以下内容,则会得到预期的结果:
// strText defined earlier
QRegExp start(...);
QRegExp end(...);
int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart);
iEnd += end.matchedLength();
(2) 如果示例中的strText类似于:
// strText defined earlier
QRegExp start(...);
QRegExp end(...);
int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart) + end.matchedLength();
<start>
stackoverflow is awesome!
</start>
<start>
I like cake!
</start>
<start>
Girls are pretty!
</start>
QRegExp reg("<start>(.*?)</start>");
'<root>\n<start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start>\n</root>'
stackoverflow太棒了!
我喜欢蛋糕!
女孩很漂亮!
如何编写一个Qt RegExp来捕获每个start元素的内容?比如:
// strText defined earlier
QRegExp start(...);
QRegExp end(...);
int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart) + end.matchedLength();
<start>
stackoverflow is awesome!
</start>
<start>
I like cake!
</start>
<start>
Girls are pretty!
</start>
QRegExp reg("<start>(.*?)</start>");
'<root>\n<start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start>\n</root>'
QRegExp reg((*?);
永远不会为我工作,即使它似乎应该与POSIX正则表达式一起工作(这是我相信Qt实现的)。(注意:我知道实现这一点的理想方法是使用XML/HTML解析器(我实际上是在解析HTML),但我现在对正则表达式解决方案感兴趣)
谢谢大家!
需要转义。尝试:
QRegExp reg("\<start\>(.*?)\</start\>");
QRegExp reg(“\(*?”)”;
我无法用您的第一个代码片段重现问题。它在我的Ubuntu盒上运行得很好
就你的正则表达式而言,有几个问题。首先,您正在使用?
来实现正则表达式的非贪婪性,但它不适用于Qt
。相反,您必须调用QRegExp.setMinimal(bool)
方法。引述:
非贪婪匹配不能应用于单个量词,但
可以应用于模式中的所有量词
如果字符串类似于:
// strText defined earlier
QRegExp start(...);
QRegExp end(...);
int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart) + end.matchedLength();
<start>
stackoverflow is awesome!
</start>
<start>
I like cake!
</start>
<start>
Girls are pretty!
</start>
QRegExp reg("<start>(.*?)</start>");
'<root>\n<start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start>\n</root>'
如果您尝试一下,我相信您可以很容易地将其转换为
Qt
代码。我没有收到任何关于答案的反馈。你能告诉我它是否有用吗?如果不是,也许我可以改进它。