このページでは

QStringTokenizer Class

template <typename Haystack, typename Needle> class QStringTokenizer

QStringTokenizer クラスは、指定された区切り文字に沿って文字列をトークンに分割します。詳細...

ヘッダー: #include <QStringTokenizer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
以下のように: Qt 6.0
継承元: QtPrivate::Tok::HaystackPinning(プライベート)、QtPrivate::Tok::NeedlePinning(プライベート)、および

注:このクラスのすべての関数は再入可能である。

パブリック型

パブリック関数

QStringTokenizer(Haystack haystack, Needle needle, Qt::CaseSensitivity cs, Qt::SplitBehavior sb = Qt::KeepEmptyParts)
QStringTokenizer(Haystack haystack, Needle needle, Qt::SplitBehavior sb = Qt::KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive)
QStringTokenizer<Haystack, Needle>::iterator begin() const
QStringTokenizer<Haystack, Needle>::iterator cbegin() const
QStringTokenizer<Haystack, Needle>::sentinel cend() const
QStringTokenizer<Haystack, Needle>::sentinel end() const
LContainer toContainer(LContainer &&c = {}) const &
RContainer toContainer(RContainer &&c = {}) const &&
(since 6.0) auto qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)

詳細な説明

QStringTokenizer<Haystack, Needle> は、Haystack がトークン化される文字列の型、Needle が区切り文字の型であるテンプレートクラスです。実際には、これらのテンプレート引数を明示的に指定する必要はまったくありません。これらはコンパイラによって自動的に推論されます。

指定された区切り文字が現れる箇所ごとに文字列を部分文字列に分割し、それらの文字列の(遅延構築された)リストを返します。 文字列内のどこにも区切り文字が一致しない場合、その文字列を含む単一要素のリストを生成します。区切り文字が空の場合、QStringTokenizer はその文字列の後に、文字列の各文字を順に追加し、さらにその後に空の文字列を1つ追加した文字列を生成します。2つの列挙型Qt::SplitBehavior とQt::CaseSensitivity は、出力をさらに制御します。

QStringTokenizer はQStringView::tokenize() を呼び出しますが、これを直接使用することも可能です:

for (auto it : QStringTokenizer{string, separator})
    use(*it);

注: QStringTokenizerのテンプレート引数には、決して名前を明示的に付けてはいけません。 QStringTokenizer{string, separator} (テンプレート引数なし)を記述するか、QStringView::tokenize() またはQLatin1StringView::tokenize() のいずれかを使用し、その戻り値をauto 型の変数にのみ格納してください:

auto result = strview.tokenize(sep);

これは、QStringTokenizerのテンプレート引数が、その生成元となる特定の文字列型や区切り文字型に対して非常に微妙な依存関係を持っており、通常、実際に渡された型とは一致しないためです。

遅延シーケンス

QStringTokenizerは、いわゆる「遅延シーケンス」として動作します。つまり、次の要素は、それを要求した時点で初めて計算されます。遅延シーケンスには、メモリ使用量がO(1)で済むという利点があります。一方、少なくともQStringTokenizerに関しては、順方向の反復のみが可能で、ランダムアクセスによる反復はできないという欠点があります。

想定される使用例は、range 付きの for ループにそのまま組み込むことです:

for (auto it : QStringTokenizer{string, separator})
    use(*it);

あるいは、C++20の範囲アルゴリズムに組み込むことです:

std::ranges::for_each(QStringTokenizer{string, separator},
                      [] (auto token) { use(token); });

終了センチネル

QStringTokenizer のイテレータは、従来の STL アルゴリズムでは使用できません。なぜなら、それらのアルゴリズムはイテレータ/イテレータペアを必要とするのに対し、QStringTokenizer はセンチネルを使用するからです。つまり、範囲の終わりを示すために、別の型である `QStringTokenizer::sentinel` を使用しています。 センチネルは空の型であるため、これによりパフォーマンスが向上します。センチネルは、C++17(範囲指定 for ループ用)および C++20(新しい範囲ライブラリを使用するアルゴリズム用)からサポートされています。

一時変数

QStringTokenizerは、ダングリング参照を回避するよう非常に慎重に設計されています。一時的な文字列(rvalue)からトークナイザーを構築した場合、その引数は内部的に保存されるため、参照されているデータはトークナイズされる前に削除されることはありません:

auto tok = QStringTokenizer{widget.text(), u','};
// return value of `widget.text()` is destroyed, but content was moved into `tok`
for (auto e : tok)
   use(e);

名前付きオブジェクト(lvalue)を渡した場合、QStringTokenizer はそのコピーを保存しません。トークナイザーが処理を行う期間よりも長く、名前付きオブジェクトのデータを保持し続ける責任はユーザーにあります:

auto text = widget.text();
auto tok = QStringTokenizer{text, u','};
text.clear();      // destroy content of `text`
for (auto e : tok) // ERROR: `tok` references deleted data!
    use(e);

QStringView::split()、QString::split()、およびQRegularExpressionも参照してください 。

メンバ型のドキュメント

[alias] QStringTokenizer::const_iterator

このtypedefは、QStringTokenizer に対してSTLスタイルのconstイテレータを提供します。

iteratorも参照してください 。

[alias] QStringTokenizer::const_pointer

value_type * の別名。

[alias] QStringTokenizer::const_reference

value_type & の別名です。

[alias] QStringTokenizer::difference_type

qsizetype の別名。

[alias] QStringTokenizer::iterator

このtypedefは、QStringTokenizer に対してSTLスタイルのconstイテレータを提供します。

QStringTokenizer 可変イテレータはサポートされていないため、これは `const_iterator` と同じです。

const_iteratorも参照してください 。

[alias] QStringTokenizer::pointer

value_type * の別名です。

QStringTokenizer 可変イテレータをサポートしていないため、これは `const_pointer` と同じです。

[alias] QStringTokenizer::reference

value_type & の別名です。

QStringTokenizer 可変参照をサポートしていないため、これは `const_reference` と同じです。

[alias] QStringTokenizer::sentinel

このtypedefは、QStringTokenizer::iterator およびQStringTokenizer::const_iterator に対して、STLスタイルのセンチネルを提供します。

const_iteratorも参照してください 。

[alias] QStringTokenizer::size_type

qsizetype の別名。

[alias] QStringTokenizer::value_type

const QStringView またはconst QLatin1StringView の別名です。これは、トークナイザーのHaystack テンプレート引数の値によって異なります。

メンバ関数のドキュメント

[explicit constexpr noexcept(...)] QStringTokenizer::QStringTokenizer(Haystack haystack, Needle needle, Qt::CaseSensitivity cs, Qt::SplitBehavior sb = Qt::KeepEmptyParts)

[explicit constexpr noexcept(...)] QStringTokenizer::QStringTokenizer(Haystack haystack, Needle needle, Qt::SplitBehavior sb = Qt::KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive)

文字列 `haystack ` を、needle が出現する箇所で部分文字列に分割し、検出された部分文字列を順に反復処理できるようにする文字列トークナイザーを構築します。もし `needle ` が `haystack` のどこにも一致しない場合、haystack を含む単一の要素が生成されます。

cs needle の照合を大文字小文字を区別するか、区別しないかを指定します。

sb がQt::SkipEmptyParts の場合、結果には空のエントリは含まれません。デフォルトでは、空のエントリが含まれます。

注: std::is_nothrow_copy_constructible<QStringTokenizer>::value がtrue の場合、( 1)はnoexceptとなります。

注: std::is_nothrow_copy_constructible<QStringTokenizer>::value がtrue の場合、( 2) は noexcept となります。

関連項目: QStringView::split()、QString::split()、Qt::CaseSensitivity 、およびQt::SplitBehavior 。

[noexcept] QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer::begin() const

[noexcept] QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer::cbegin() const

リストの最初のトークンを指す、STL スタイルのconstイテレータを返します。

end() およびcend()も参照してください 。

[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::cend() const

end() と同じです。

cbegin() およびend()も参照してください 。

[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::end() const

リストの最後のトークンの直後に続く、架空のトークンを指す、STL スタイルのconstセンチネルを返します。

begin() およびcend()も参照してください 。

template <typename LContainer> LContainer QStringTokenizer::toContainer(LContainer &&c = {}) const &

遅延シーケンスを、LContainer 型の(通常は)ランダムアクセス可能なコンテナに変換します。

この関数は、Container に、このトークナイザーのvalue_type と一致するvalue_type が存在する場合にのみ利用可能です。

c として名前付きコンテナ(lvalue)を渡した場合、そのコンテナにデータが格納され、そのコンテナへの参照が返されます。一時コンテナ(rvalue、デフォルト引数を含む)を渡した場合、そのコンテナにデータが格納され、値として返されます。

// assuming tok's value_type is QStringView, then...
auto tok = QStringTokenizer{~~~};
// ... rac1 is a QList:
auto rac1 = tok.toContainer();
// ... rac2 is std::pmr::vector<QStringView>:
auto rac2 = tok.toContainer<std::pmr::vector<QStringView>>();
auto rac3 = QVarLengthArray<QStringView, 12>{};
// appends the token sequence produced by tok to rac3
//  and returns a reference to rac3 (which we ignore here):
tok.toContainer(rac3);

これにより、シーケンスの保存方法について最大限の柔軟性が得られます。

template <typename RContainer> RContainer QStringTokenizer::toContainer(RContainer &&c = {}) const &&

遅延シーケンスを、型RContainer の(通常は)ランダムアクセス可能なコンテナに変換します。

lvalue-thisオーバーロードに対する制約に加え、このrvalue-thisオーバーロードは、このQStringTokenizer が内部でhaystackを格納していない場合にのみ利用可能です。これは、そうでないとダングリング参照で満たされたコンテナが生成される可能性があるためです:

auto tokens = QStringTokenizer{widget.text(), u','}.toContainer();
// ERROR: cannot call toContainer() on rvalue
// 'tokens' references the data of the copy of widget.text()
// stored inside the QStringTokenizer, which has since been deleted

これを修正するには、QStringTokenizer を一時変数に格納します:

auto tokenizer = QStringTokenizer{widget.text90, u','};
auto tokens = tokenizer.toContainer();
// OK: the copy of widget.text() stored in 'tokenizer' keeps the data
// referenced by 'tokens' alive.

代わりにビューを渡すことで、この関数の実行を強制できます:

func(QStringTokenizer{QStringView{widget.text()}, u','}.toContainer());
// OK: compiler keeps widget.text() around until after func() has executed

c として名前付きコンテナ(lvalue)を渡すと、そのコンテナが埋められ、それへの参照が返されます。一時コンテナ(rvalue、デフォルト引数を含む)を渡すと、そのコンテナが埋められ、値として返されます。

これはオーバーロードされた関数です。

関連する非メンバ関数

[constexpr noexcept(...), since 6.0] template < typename Haystack, typename Needle, typename... Flags > auto qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)

QStringTokenizer のファクトリ関数で、文字列 `haystack ` を、`needle ` が出現する箇所ごとに部分文字列に分割し、検出された部分文字列を順次処理できるようにします。`haystack` 内のどこにも `needle ` が一致しない場合、`haystack ` を含む単一の要素が生成されます。

Qt::CaseSensitivity およびQt::SplitBehavior 列挙型の値をflags として渡すことで、トークナイザーの動作を変更できます。

この関数は Qt 6.0 で導入されました。

注: QtPrivate::Tok::is_nothrow_constructible_from<Haystack, Needle>::value がtrue の場合、この関数は noexcept です。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.