2

フロントスラッシュ (/) とバックスラッシュ () の両方で文字列を分割する方法を考えています。たとえば、これらのタイプの文字列です。

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

また、混合スラッシュ。

"X:/Blah\blah/"

動作し、いずれの場合も次のように返されます: "X:", "Blah", "blah"

QRegExp、 http: //doc.qt.io/archives/qt-4.7/qregexp.html を使用する必要があると思いますが、使用する必要がある文字セットがわかりません。

4

3 に答える 3

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

正規表現では、バックスラッシュ文字が文字をエスケープするのを防ぐために 2 つのバックスラッシュが必要]です。C++ では、\リテラルを渡すためにさらに 2 つ追加されます。

于 2012-09-10T15:24:18.450 に答える
3

ファイル名を解析している場合、QFileInfo を使用するのはどうですか?

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

これにより、すべてがスラッシュに変換されます。絶対パスを出力する場合:

qDebug() << fileInfo.absolutePath();

出力には、次のようなスラッシュのみが含まれます。

"C:/test folder/one/test"

次に、通常の分割コマンド as so を使用して、コンポーネントを取得できます。

QStringList fileParts = fileInfo.absolutePath().split("/");
于 2012-09-11T03:13:48.007 に答える
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、これは最良の通常の式の実装ではありません。そのため、Qt5には内部QRegularExpressionで使用する新しいクラスがあります。PCRE

于 2012-09-11T12:52:59.937 に答える