std::regex_traits<CharT>::transform_primary

< cpp‎ | regex‎ | regex traits
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") (这在美国英语本地环境中对来自 "AÀÁÂÃÄÅaàáâãäå" 的任何 c1 为真)。注意 transform_primary() 接收字符序列参数,因为等价类可能是多字符,如捷克语中的 [[=ch=]] 或匈牙利语中的 [[=dzs=]]

没有以 std::locale 定义初等排序关键的可移植方式,因为从 std::collate::transform() 所返回的对照关键到初等等价关键的转换是本地环境限定的,而且若用户替换 std::collate 平面,则转换就不再是标准库的 std::regex_traitsstd::regex_traits 的标准库特化返回空字符串,除非当前感染的本 locale 的 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