如何使用正則表達式從字符串中獲取所有匹配?
我有一個字符串:從字符串中分出匹配
".+(.cpp$|.cxx$|.d$|.h$|.hpp$)"
,我想只得到CPP CXX d H和HPP部分。
編輯:
所以基本上我想構建正則表達式,它將匹配任何字符串以字符開頭並以$結尾。
我已經試過模式:"\\.[^$+]+"
這是爲了匹配點和其他一切,除了$和加一次或多次,但得到的只是第一部分的.cpp,我需要所有這些
如何使用正則表達式從字符串中獲取所有匹配?
我有一個字符串:從字符串中分出匹配
".+(.cpp$|.cxx$|.d$|.h$|.hpp$)"
,我想只得到CPP CXX d H和HPP部分。
編輯:
所以基本上我想構建正則表達式,它將匹配任何字符串以字符開頭並以$結尾。
我已經試過模式:"\\.[^$+]+"
這是爲了匹配點和其他一切,除了$和加一次或多次,但得到的只是第一部分的.cpp,我需要所有這些
既然你在你的問題提的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();
}
#Dave Mateer謝謝,即將做同樣的事情。謝謝。只有一個註釋,我認爲可能有一個正則表達式選項來分叉那些沒有循環的匹配。 – user336635 2011-12-23 12:52:18
有沒有通用的解決方案因爲它實際上取決於你的正則表達式實現是如何工作的以及它如何被調用 - 並且考慮到對於C++沒有標準的,你應該提及你正在使用哪一個。
首先,如果要匹配.
而不是「任何字符」,則必須先逃脫.
。另外,我會改變正則表達式:"\.(d|[ch](?:pp|xx)?)$"
。通過這種方式,您可以保持點和線以外的匹配。
對於實際的調用(這將取決於您的實現),您必須使用某種MATCH_ALL
或GLOBAL_MATCH
標誌或簡單地循環輸入字符串,始終在上一次匹配之後開始。考慮到行結束,你可以簡單地使用它每個輸入行(因爲我不知道你的輸入數據)。
找到最後一個「。」的位置。以及對所有你感興趣的後綴測試剩餘串
既然你是隻關心標點符號之間的元素,可以用它們作爲分隔符來分割字符串QStringList::split
:
QString target = ".+(.cpp$|.cxx$|.d$|.h$|.hpp$)";
QStringList extensions = target.split(QRegExp("\\W+"), QString::SkipEmptyParts);
qDebug() << extensions; // ("cpp", "cxx", "d", "h", "hpp")
爲什麼這個標記爲C++?你問在C++中如何使用正則表達式,還是你問哪個正則表達式匹配你的模式?這些應該是兩個不同的問題。 – 2011-12-23 10:46:48
#Kerrek SB我在問如何形成一個正則表達式,它只能從字符串和擴展中獲得這些擴展。它被標記爲C++,因爲當我沒有用語言標記關於正則表達式的問題時,人們問我正在使用哪種語言。 – user336635 2011-12-23 10:50:09
@ user336635:那麼你如何使用正則表達式? – kennytm 2011-12-23 11:13:15