C++ QregularExpression中的前瞻断言
C++ QregularExpression中的前瞻断言,c++,regex,qt,C++,Regex,Qt,QRegularExpression是否在其正则表达式引擎中提供前瞻性关联? 我已经测试了这个示例,但没有得到匹配的字符串 QString s = "px1 pt 2px 3em 4px"; QRegularExpression re("\\d(?=px)"); auto match = re.match(s); qDebug()<< match.lastCapturedIndex(); QString s=“px1 pt 2px 3em 4px”; QRegularExpress
QRegularExpression
是否在其正则表达式引擎中提供前瞻性关联?
我已经测试了这个示例,但没有得到匹配的字符串
QString s = "px1 pt 2px 3em 4px";
QRegularExpression re("\\d(?=px)");
auto match = re.match(s);
qDebug()<< match.lastCapturedIndex();
QString s=“px1 pt 2px 3em 4px”;
QRegularExpression re(\\d(?=px)”;
自动匹配=重新匹配;
qDebug()为什么在第二行中有一个额外的反斜杠?为什么不使用
\d+(?=px)
而不是
\\d(?=px)
我之所以添加a+,是因为\d只能捕获一个数字,+允许它捕获一个或多个数字
我不确定lookahead是否能在regex引擎中工作,但如果不能,你可以使用这个
(\d+)px
请参见以下示例:
使用PCRE正则表达式,因此它支持lookaheads、lookbehinds,甚至懒散量词。在您的情况下,只有一个完整的匹配值,没有捕获,因此使用match.captured(0)
访问该值
使用
QRegularExpression re(\\d+(?=px)”;
QRegularExpressionMatchIterator i=re.globalMatch(“px1 pt 2px 3em 4px”);
英语单词;
while(i.hasNext()){
QRegularExpressionMatch=i.next();
QString word=match.captured(0);
因为斜杠是转义字符。谢谢你的例子,这是一个非常好的站点。但是为什么要转义\d?如果你在\d中转义,\n那么你的正则表达式现在寻找的是文字\后跟d,而不是\d的含义(范围从0到9,[0-9])视图@ MasLo:因为在一个C++字符串中,反斜杠需要被释放。在一个字符串<代码> \d>代码>中将是一个转义序列,如“代码> > \n>代码>换行符(不是<代码> \d>代码>是一个有效的转义序列,但这不是重点)。Qt支持LokAkHead。但是您的代码不起作用。我创建了“PX”。表达式应该在括号中。因此我编辑了您的答案。非常感谢您的回答。不,您不需要在px
周围使用捕获组。这是不必要的,因为您只想获取数字,它们存储在匹配中。捕获(0)
(第零项)。您没有使用我的代码,好吧,但捕获px
仍然没有意义。然后捕获数字。是的。您的代码是正确的。我想我应该检查我的代码。
QRegularExpression re("\\d+(?=px)");
QRegularExpressionMatchIterator i = re.globalMatch("px1 pt 2px 3em 4px");
QStringList words;
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
QString word = match.captured(0);
words << word;
}
// words contains "2", "4"