2012-09-10 94 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