std::regex_traits<CharT>::transform_primary
| template< class ForwardIt > string_type transform_primary( ForwardIt first, ForwardIt last ) const; |
||
文字シーケンス [first, last) について、現在のロケールで設定された照合順序におけるプライマリソートキーを取得します。これは、大文字・小文字、ダイアクリティカルマーク、バリアントなどを無視して、文字や照合単位が各国語のアルファベットで占める位置に基づいたソートキーです。プライマリソートキーが operator< によって別のプライマリソートキーよりも小さいと評価される場合、最初のソートキーを生成した文字シーケンスは、2番目のソートキーを生成した文字シーケンスよりも、現在のロケールにおけるプライマリ照合順序で前に来ます。
正規表現ライブラリは、このトレイトを使用して文字を同等クラスと照合します。たとえば、正規表現 [[=a=]] は、traits.transform_primary(c1) が traits.transform_primary("a") と同等である場合に文字 c1 と等価です(これは、米国英語ロケールにおいて、"AÀÁÂÃÄÅaàáâãäå" の任意の c1 に対して真です)。同等クラスは複数文字になる場合があるため(例:チェコ語の [[=ch=]] やハンガリー語の [[=dzs=]])、transform_primary() は文字シーケンス引数を受け取ります。
std::locale でプライマリソートキーを定義する移植性の高い方法はありません。なぜなら、std::collate::transform() が返す照合キーからプライマリ同等キーへの変換はロケール固有であり、ユーザーが std::collate ファセットを置き換えた場合、その変換は標準ライブラリの std::regex_traits には認識されなくなるからです。標準ライブラリによる std::regex_traits の特殊化は、現在のロケールで設定された std::collate ファセットがユーザーによって置き換えられておらず、かつシステム供給の std::collate ファセットと一致する場合にのみ、結果を返します(この場合、std::collate_byname<CharT>::transform(first, last) が実行され、それが生成するソートキーは、ロケール固有の変換を使用して期待されるプライマリソートキーに変換されます)。それ以外の場合、標準ライブラリの特殊化は空文字列を返します。
[編集] パラメータ
| first, last | - | 比較対象の文字シーケンスを決定するイテレータのペア |
| 型要件 | ||
-ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。 | ||
[編集] 戻り値
現在のロケールにおける、大文字・小文字、バリアント、ダイアクリティカルマークなどを無視した、文字シーケンス [first, last) のプライマリソートキー。
[編集] 例
transform_primary() を介して機能する正規表現の機能を示します。
#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
| このセクションは未完成です 理由: ユーザー定義の regex_traits とユーザー定義の transform_primary を使用した例が考えられます |