首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT QRegularExpression QRegularExpressionMatchIterator失效(SIGSEGV)

QT QRegularExpression QRegularExpressionMatchIterator失效(SIGSEGV)
EN

Stack Overflow用户
提问于 2014-03-26 21:42:23
回答 1查看 1.4K关注 0票数 0

我正在尝试使用QRegularExpression,它对我所有的模式都很好,除了这一点。

我有一条短信:

代码语言:javascript
复制
TYPE "ASDF"
   some content
END_TYPE

TYPE "QWER"
   some other content
END_TYPE

TYPE "ZXCV"
   blablablabla
END_TYPE

我想在一个像这样的QRegularExpression中匹配所有的QRegularExpression块(3个匹配)

代码语言:javascript
复制
QRegularExpression re("(TYPE(?:[^E]|E[^N]|EN[^D]|END[^_]|END_[^T])*END_TYPE)", QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator i = re.globalMatch(text);
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    if (match.hasMatch()) {
        QString captured = match.captured(0);
        //.. and do some stuff with that string
    }
}

但是,当我构建和调试代码时,我会在QRegularExpressionMatchIterator上得到一个分段错误窗口:

因为接收到来自操作系统的信号,次方停止了操作。信号名称: SIGSEGV,信号含义:分段故障

我也试过用消极的眼神:

代码语言:javascript
复制
(TYPE ((?!END_TYPE))+END_TYPE)

这不给我一个错误,但也给我没有匹配。

有没有人知道我在这里做错了什么,或者建议我如何改进正则表达式?如有任何建议,将不胜感激:)

EN

回答 1

Stack Overflow用户

发布于 2014-03-26 23:12:59

好的,在RyanJCAustin的大力帮助下,我解决了我的问题。代码现在是这样的:

代码语言:javascript
复制
QRegularExpression re("(TYPE .+END_TYPE)");
re.setPatternOptions(QRegularExpression::DotMatchesEverythingOption | QRegularExpression::InvertedGreedinessOption);
QRegularExpressionMatchIterator i = re.globalMatch(text);
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    if (match.hasMatch()) {
        QString captured = match.captured(0);
    }
}

看起来QRegularExpression不支持负面的外观(类型(?END_TYPE))+END_TYPE)或分组(类型(?:^E|E^N|EN^D|END^_|END_^T)*END_TYPE))。

因此,修复方法是使用QRegularExpression::InvertedGreedinessOption (与QRegExp::setMinimal()相同)进行最小匹配。

谢谢RyanJ和CAustin的帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22673671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档