Namespaces
Variants

std::regex_traits<CharT>:: transform_primary

From cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
Exceptions
Traits
Constants
(C++11)
Regex Grammar
template < class ForwardIt >
string_type transform_primary ( ForwardIt first, ForwardIt last ) const ;

对于字符序列 [ first , last ) ,获取当前本地化环境中基于字母表位置的主排序键,该排序键忽略大小写、变音符号、变体形式等。若一个主排序键通过 operator < 比较小于另一个主排序键,则在当前本地化环境的主排序规则中,生成第一个排序键的字符序列应排在生成第二个排序键的字符序列之前。

正则表达式库使用此特征来匹配等价类中的字符。例如,当 traits. transform_primary ( c1 ) 等价于 traits. transform_primary ( "a" ) 时(对于美式英语区域中 "AÀÁÂÃÄÅaàáâãäå" 内的任意 c1 成立),正则表达式 [ [ = a = ] ] 等价于字符 c1 。需注意 transform_primary() 接受字符序列参数,因为等价类可能是多字符序列,例如捷克语中的 [ [ = ch = ] ] 或匈牙利语中的 [ [ = dzs = ] ]

由于从 std :: collate :: transform ( ) 返回的排序键到主等价键的转换是区域设置特定的,且如果用户替换了 std::collate facet,标准库的 std::regex_traits 将不再知晓该转换方式,因此无法通过 std::locale 以可移植方式定义主排序键。标准库对 std::regex_traits 的特化会返回空字符串,除非当前植入的区域设置的 std::collate facet 未被用户替换且仍与系统提供的 std::collate facet 匹配(此时会执行 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