2012-09-10 97 views
2

我只是想知道如何通過兩個前斜線(/)& backslashes()分割字符串。例如,這些類型的字符串;按斜槓分割字符串

"X:/Blah/blah/" 
"X:\Blah\blah\" 

還有混合斜線;

"X:/Blah\blah/" 

會在每種情況下返回工作&: 「X」,「嗒嗒」,「嗒嗒」

我相信我會需要使用QRegExp,http://doc.qt.io/archives/qt-4.7/qregexp.html但我只是不知道我將需要使用哪些字符集。

回答

6
str.split(QRegExp("[/\\\\]")); 

正則表達式需要兩個反斜槓來防止反斜槓字符逸出]字符,和C++增加額外的兩個,這樣你正在傳遞\文字。

+0

感謝您的答覆,但它不支持後擋板。只有正斜槓。我怎樣才能得到反斜槓支持? – Danran

+0

它在我的測試反斜槓上工作... – Chris

+0

我明白我做錯了什麼。我在我的路徑中提供了只有一個反斜槓的字符串。因此這被忽略了。好吧,我決定只是將所有內容都替換成反斜槓,但謝謝你的答案。 – Danran

3

如果您正在解析文件名,那麼使用QFileInfo怎麼樣?

QFileInfo fileInfo("c:\\test folder\\one\\test\\three.avi"); 

這將一切正斜槓轉換。當你輸出的絕對路徑:

qDebug() << fileInfo.absolutePath(); 

輸出將只是有斜槓是這樣的:

"C:/test folder/one/test" 

然後,您可以使用常規的拆分命令,因此要獲得的組件:

QStringList fileParts = fileInfo.absolutePath().split("/"); 
1

由於正則表達式可能是昂貴的評估,也許更好的解決方案將取代字符,然後拆分(假設正則表達式不會變得更復雜)。

QString string = someFilePath(); 
//replace one char with another, requires no memory allocation 
string.replace('\\', '/', Qt::CaseSensitive); 
//you may want to use QString::KeepEmptyParts instead 
QStringList pathElements = string.split('/', QString::SkipEmptyParts, Qt::CaseSensitive); 

這樣就不需要編譯正則表達式並對其進行評估。這應該使它快一點。另外QRegExp不是最好的常規表達式實現,這就是爲什麼在Qt 5中有一個新類QRegularExpression,它在內部使用PCRE