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 (private), QtPrivate::Tok::NeedlePinning (private), を継承しています。

注意:このクラスの関数はすべてリエントラントです。

パブリック型

パブリック関数

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 は空の文字列を生成し、その後に文字列の各文字が続き、さらに空の文字列が続きます。Qt::SplitBehaviorQt::CaseSensitivity の 2 つの列挙は、さらに出力を制御します。

QStringTokenizer はQStringView::tokenize() を駆動しますが、これを直接使用することもできます:

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

注意: QStringTokenizerのテンプレート引数に明示的な名前を付けてはいけません。QStringTokenizer{string, separator} (テンプレート引数なし)を書くか、qTokenize ()関数、QStringView::split ()またはQLatin1StringView::split()メンバ関数を使用し、戻り値のみをauto 変数に格納することができます:

auto result = string.split(sep);

これは、QStringTokenizer のテンプレート引数が、それらを構築する特定の文字列型および区切り文字型に非常に微妙に依存しており、通常は渡された実際の型に対応していないためです。

遅延シーケンス

QStringTokenizer は、いわゆる遅延シーケンスとして動作します。つまり、次の各要素は、要求された時点で初めて計算されます。遅延シーケンスには、O(1)のメモリしか必要としないという利点があります。しかし、少なくともQStringTokenizerでは、ランダムアクセスではなく順方向の繰り返し処理しかできないという欠点があります。

想定される使用例は、範囲指定された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 はセンチネルを使用します。つまり、QStringTokenizer::sentinel という別の型を使用して、範囲の終わりをマークします。これは、センチネルが空の型であるため、パフォーマンスが向上します。センチネルは、C++17(範囲指定用)および 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 はコピーを保存しません。名前付きオブジェクト (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

この型定義は,QStringTokenizer に対する STL スタイルの const イテレータを提供する.

iteratorも参照

[alias] QStringTokenizer::const_pointer

value_type * のエイリアス。

[alias] QStringTokenizer::const_reference

value_type & のエイリアス。

[alias] QStringTokenizer::difference_type

qsizetype のエイリアス。

[alias] QStringTokenizer::iterator

この型定義は,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

この型定義は,QStringTokenizer::iteratorQStringTokenizer::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 が出現するあらゆる場所で部分文字列に分割し、それらの文字列が見つかったときに、それらの文字列を繰り返し処理できるようにする文字列トー クナイザを構築する。needlehaystack のどこにもマッチしない場合、haystack を含む単一の要素が生成される。

cs は、 を大文字小文字を区別してマッチさせるか、 大文字小文字を区別せずにマッチさせるかを指定する。needle

sbQt::SkipEmptyParts の場合、空のエントリは結果に現れない。デフォルトでは、空のエントリが含まれる。

注意: (1) は、std::is_nothrow_copy_constructible<QStringTokenizer>::valuetrue の場合、noexcept となる。

注意: (2) は、std::is_nothrow_copy_constructible<QStringTokenizer>::valuetrue のとき 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

リストの最初のトークンを指す constSTL 形式のイテレータを返します。

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

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

end() と同じ。

cbegin() およびend()も参照の こと。

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

リストの最後のトークンの後にある架空のトークンを指す constSTL 形式のセンチネルを返します。

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

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

遅延シーケンスをLContainer 型の(通常)ランダムアクセスコンテナに変換する。

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

c に名前付きコンテナ(l値)を渡すと、そのコンテナが満たされ、そのコンテナへの参照が返される。一時的なコンテナ(r値、デフォルト引数を含む)を渡すと、そのコンテナが満たされ、値が返されます。

// 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 に名前付きコンテナ(l値)を渡すと、そのコンテナが満たされ、そのコンテナへの参照が返される。一時的なコンテナ(デフォルト引数を含むr値)を渡すと、そのコンテナが満たされ、値が返されます。

関連する非会員

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

文字列haystack を、needle が出現するあらゆる場所で部分文字列に分割し、それらの文字列が見つかったときに、それらの文字列を繰り返し処理できるようにする、QStringTokenizer のファクトリ関数。needlehaystack のどこにもマッチしない場合、haystack を含む単一の要素が生成される。

Qt::CaseSensitivityQt::SplitBehavior の列挙子からflags として値を渡して、トークナイザーの動作を変更します。

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

注意: この関数は、QtPrivate::Tok::is_nothrow_constructible_from<Haystack, Needle>::valuetrue の場合は noexcept となります。

© 2025 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.