C++ 从字符串中分叉匹配项
如何使用正则表达式从字符串中获取所有匹配项?C++ 从字符串中分叉匹配项,c++,regex,qt,C++,Regex,Qt,如何使用正则表达式从字符串中获取所有匹配项? 我有一个字符串: ".+(.cpp$|.cxx$|.d$|.h$|.hpp$)" 我只想购买cpp cxx d h和hpp零件。 编辑: 因此,基本上我想构造一个正则表达式,它可以匹配任何以点开头,以$结尾的字符串。 我已经尝试过这种模式:“\\.[^$+]+” >除了$1和一次或更多次之外,它应该匹配点和其他所有的东西,但是这只是第一个.CPP部分,我需要所有的它们< p>没有通用的解决方案,因为它实际上取决于您的正则表达式实现方式以及它如
我有一个字符串:
".+(.cpp$|.cxx$|.d$|.h$|.hpp$)"
我只想购买cpp cxx d h和hpp零件。编辑:
因此,基本上我想构造一个正则表达式,它可以匹配任何以点开头,以$结尾的字符串。
我已经尝试过这种模式:
“\\.[^$+]+” >除了$1和一次或更多次之外,它应该匹配点和其他所有的东西,但是这只是第一个.CPP部分,我需要所有的它们< p>没有通用的解决方案,因为它实际上取决于您的正则表达式实现方式以及它如何被调用——并且考虑到C++没有标准的(还),你应该提到你用的是哪一个
首先,如果要匹配
,而不仅仅是“任何字符”,则必须转义
。另外,我还要更改正则表达式:“\(d|[ch](?:pp|xx)?)$”
。这样你就可以让点和线在比赛之外结束
对于实际调用(这取决于您的实现),您必须使用某种类型的MATCH_ALL
或GLOBAL_MATCH
标志,或者简单地循环输入字符串,始终在上一次匹配之后开始。考虑到行尾,您只需在每个输入行中使用它一次(因为我不知道您的输入数据)。找到最后一个“.”的位置,并根据您感兴趣的所有后缀测试剩余字符串。既然您在问题中提到了Qt,下面是如何使用QRegExp
:
#include <QtCore>
#include <QtDebug>
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
QString target(".+(.cpp$|.cxx$|.d$|.h$|.hpp$)");
QRegExp pattern("\\.(\\w+)\\$");
QStringList matches;
int pos = 0;
while ((pos = pattern.indexIn(target, pos)) != -1) {
matches << pattern.cap(1);
pos += pattern.matchedLength();
}
qDebug() << matches; // "cpp", "cxx", "d", "h", "hpp"
return app.exec();
}
#包括
#包括
int main(int argc,字符**argv){
QCore应用程序应用程序(argc、argv);
QString目标(“.+(.cpp$|.cxx$|.d$|.h$|.hpp$)”;
QRegExp模式(\\.(\\w+\\\$);
英语比赛;
int pos=0;
而((pos=pattern.indexIn(target,pos))!=-1){
匹配因为您只对标点符号之间的元素感兴趣,所以可以使用它们作为分隔符,使用QStringList::split
:
QString target = ".+(.cpp$|.cxx$|.d$|.h$|.hpp$)";
QStringList extensions = target.split(QRegExp("\\W+"), QString::SkipEmptyParts);
qDebug() << extensions; // ("cpp", "cxx", "d", "h", "hpp")
QString target=“.+(.cpp$|.cxx$|.d$|.h$|.hpp$)”;
qstringlitextensions=target.split(QRegExp(“\\W+”),QString::skipmptyparts);
qDebug()为什么这个C++?你问如何在C++ C++中使用正则表达式,或者你问哪个正则表达式与你的模式匹配?应该是两个独立的问题。语言人们问我用的是什么语言。@user336635:那你怎么使用正则表达式?#戴夫·马特尔,谢谢,我也正准备这么做。谢谢。我只想说一句,我想可能有一个正则表达式选项可以在不循环的情况下分叉这些匹配。