如何使用正则表达式从字符串中获取所有匹配项?
我有一个字符串:
".+(.cpp$|.cxx$|.d$|.h$|.hpp$)"
我想只得到cpp cxx d h和hpp部分
编辑:
所以基本上我想构造一个正则表达式,它匹配任何以dot开头并以$。结尾的字符串
我已经尝试了模式:"\\.[^$+]+"
它应该匹配点和其他一切除了$和加一次或多次,但这只得到第一个.cpp部分,我需要所有这些
答案 0 :(得分:0)
没有通用的解决方案,因为它实际上取决于你的正则表达式实现是如何工作的以及它是如何被调用的 - 并且考虑到C ++还没有标准的(现在),你应该提到你正在使用的那个。
首先,你必须逃脱.
,如果它意味着匹配.
而不仅仅是“任何角色”。另外,我要更改正则表达式:"\.(d|[ch](?:pp|xx)?)$"
。通过这种方式,您可以保持点以及在匹配之外结束的行。
对于实际调用(取决于您的实现),您必须使用某种MATCH_ALL
或GLOBAL_MATCH
标志或简单地循环输入字符串,始终在上一个匹配后开始。考虑到行结束,您可能只是在每个输入行使用一次(因为我不知道您的输入数据)。
答案 1 :(得分:0)
找到最后一个“。”的位置。并针对您感兴趣的所有后缀测试剩余的字符串。
答案 2 :(得分:0)
由于您在问题中提及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();
}
答案 3 :(得分:0)
由于您只对标点符号之间的元素感兴趣,因此可以将它们用作分隔符以使用QStringList::split
分割字符串:
QString target = ".+(.cpp$|.cxx$|.d$|.h$|.hpp$)";
QStringList extensions = target.split(QRegExp("\\W+"), QString::SkipEmptyParts);
qDebug() << extensions; // ("cpp", "cxx", "d", "h", "hpp")