名前空間
変種
操作

std::regex_traits<CharT>::transform_primary

提供: cppreference.com
< cpp‎ | regex‎ | regex traits
template< class ForwardIt >
string_type transform_primary( ForwardIt first, ForwardIt last ) const;

文字シーケンス [first, last) に対する、設定されているロケールの照合順序におけるプライマリソートキー、つまり、大文字小文字、ダイアクリティカルマーク、変種などを無視した、その言語における文字および照合単位の位置に基づくソートキーを取得します。 プライマリソートキーが別のプライマリソートキーより operator< で比較して小さい場合、前者のソートキーを生成した文字シーケンスは後者のソートキーを生成した文字列より、現在設定されているロケールのプライマリ照合順序において、前に来ます。

正規表現ライブラリは、等価クラスに対して文字をマッチするためにこの特性を使用します。 例えば、 traits.transform_primary(c1)traits.transform_primary("a") と同等な場合、正規表現 [[=a=]] は文字 c1 と同等です (アメリカ英語ロケールの場合は、 "AÀÁÂÃÄÅaàáâãäå" 内の任意の c1 に対して成り立ちます)。 等価クラスは複数の文字になる場合があるため、 transform_primary() は文字シーケンスを取ることに注意してください。 例えばチェコ語の [[=ch=]] やハンガリー語の [[=dzs=]] などがあります。

std::collate::transform() によって返される照合キーからプライマリ等価キーへの変換はロケール固有であるため、 std::locale を使用してプライマリソートキーを定義する移植性のある方法はなく、ユーザが std::collate ファセットを置き換えた場合、その変換は標準ライブラリの std::regex_traits にはもはやわからなくなります。 std::regex_traits の標準ライブラリの特殊化は、現在設定されているロケールの std::collate ファセットがユーザによって置き換えられていれば空文字列を返し、未だシステム供給の std::collate ファセットにマッチし、その場合 std::collate_byname<charT>::transform(first, last) が実行され、その生成するソートキーがロケール固有の変換を用いて期待されるプライマリソートキーに変換されます。

[編集] 引数

first, last - 比較する文字シーケンスを表す一組のイテレータ
型の要件
-
ForwardItLegacyForwardIterator の要件を満たさなければなりません。

[編集] 戻り値

現在設定されているロケールにおける、大文字小文字、変種、ダイアクリティカルマークなどを無視した、文字シーケンス [first, last) に対するプライマリソートキー。

[編集]

transform_primary() を通して働く regex の機能をデモンストレーションします

#include <iostream>
#include <regex>
 
int main()
{
    std::locale::global(std::locale("en_US.UTF-8"));
    std::wstring str = L"AÀÁÂÃÄÅaàáâãäå";
    std::wregex re(L"[[=a=]]*", std::regex::basic);
    std::cout << std::boolalpha << std::regex_match(str, re) << '\n';
}

出力:

true