Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt';s QRegExp和方法顺序_Regex_Qt - Fatal编程技术网

Qt';s 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

我有两个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!
</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
代码。

我没有收到任何关于答案的反馈。你能告诉我它是否有用吗?如果不是,也许我可以改进它。