我正在尝试使用QRegularExpression,它对我所有的模式都很好,除了这一点。
我有一条短信:
TYPE "ASDF"
some content
END_TYPE
TYPE "QWER"
some other content
END_TYPE
TYPE "ZXCV"
blablablabla
END_TYPE我想在一个像这样的QRegularExpression中匹配所有的QRegularExpression块(3个匹配)
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,信号含义:分段故障
我也试过用消极的眼神:
(TYPE ((?!END_TYPE))+END_TYPE)这不给我一个错误,但也给我没有匹配。
有没有人知道我在这里做错了什么,或者建议我如何改进正则表达式?如有任何建议,将不胜感激:)
发布于 2014-03-26 23:12:59
好的,在RyanJ和CAustin的大力帮助下,我解决了我的问题。代码现在是这样的:
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的帮助!
https://stackoverflow.com/questions/22673671
复制相似问题