std::regex_traits<CharT>::transform_primary
template< class ForwardIt > string_type transform_primary( ForwardIt first, ForwardIt last ) const; |
Для последовательности символов [first, last) получает первичный ключ сортировки в порядке сортировки локали, в которую выполнена установка, то есть ключ сортировки, основанный на позициях букв и единиц сортировки в национальном алфавите, без учёта регистра, диакритических знаков, вариантов написания и т. д. Если при сравнении с помощью operator< один первичный ключ сортировки меньше другого, то последовательность символов, для которой был получен первый ключ сортировки, предшествует последовательности символов, для которой был получен второй ключ сортировки, в порядке первичной сортировки текущей локали.
Библиотека регулярных выражений использует этот признак для сопоставления символов с классами эквивалентности. Например, регулярное выражение [[=a=]] эквивалентно символу c1, если traits.transform_primary(c1) эквивалентно traits.transform_primary("a") (что верно для любого c1 из "AÀÁÂÃÄÅaàáâãäå" в локали американского английского). Обратите внимание, что transform_primary() принимает последовательность символов, поскольку классы эквивалентности могут состоять из нескольких символов, например [[=ch=]] в чешском языке или [[=dzs=]] в венгерском.
Не существует переносимого способа определить первичный ключ сортировки через 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
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/regex/regex_traits/transform_primary