# std::regex_traits<CharT>::lookup_classname

< cpp‎ | regex‎ | regex traits

template< class ForwardIt > char_class_type lookup_classname( ForwardIt first, ForwardIt last, bool icase = false ) const; |  |

若字符序列 `[first, last)` 表示当前感染的 locale 中合法的字符类名称（即正则表达式中 `[:` 与 `:]` 之间的字符串），则返回表示此字符类的实现定义值。否则，返回零。

若参数 `icase` 为 true ，则字符类忽略字符大小写，例如带 std::regex_constants::icase 的正则表达式 `[:lower:]` 生成以 `[first, last)` 指示字符串 "lower" ，且 icase == true 的 `regex_traits<>::lookup_classname()` 调用。此调用返回与带 icase == false 的正则表达式 `[:alpha:]` 所生成者相同位掩码。

始终以窄和宽字符形式辨认下列字符类，并返回如下的，感染的 locale 的 std::ctype 平面所获得的匹配分类所对应的分类（有 icase == false ）：

字符类 | std::ctype 分类
"alnum" | std::ctype_base::alnum
"alpha" | std::ctype_base::alpha
"blank" | std::ctype_base::blank
"cntrl" | std::ctype_base::cntrl
"digit" | std::ctype_base::digit
"graph" | std::ctype_base::graph
"lower" | std::ctype_base::lower
"print" | std::ctype_base::print
"punct" | std::ctype_base::punct
"space" | std::ctype_base::space
"upper" | std::ctype_base::upper
"xdigit" | std::ctype_base::xdigit
"d" | std::ctype_base::digit
"s" | std::ctype_base::space
"w" | std::ctype_base::alnum 可选地加上带 '_'

对字符串 "w" 返回的分类可以准确地与 "alnum" 相同，该情况下 isctype() 显式加上 '_' 。

系统提供的本地环境可提供额外分类，如 "jdigit" 或 "jkanji" （该情况下它们亦可通过 std::wctype 访问）。

### 参数

first, last | - | 一对迭代器，确定表示字符类名的字符序列
icase | - | 若为 true ，则忽略字符分类中的大小写区别
类型要求
- `ForwardIt` 必须满足老式向前迭代器 (LegacyForwardIterator) 的要求。

### 返回值

以给定的字符类确定的表示字符分类的位掩码，或若类未知则为 `char_class_type()` 。

### 示例

演示定制 regex_traits 的 lookup_classname/isctype 实现

    #include <iostream>
    #include <locale>
    #include <regex>
    #include <cwctype>

    // 此定制正则表达式特性以 wctype/iswctype 实现 lookup_classname/isctype
    struct wctype_traits : std::regex_traits<wchar_t>
    {
        using char_class_type = std::wctype_t;
        template<class It>
        char_class_type lookup_classname(It first, It last, bool=false) const {
            return std::wctype(std::string(first, last).c_str());
        }
        bool isctype(wchar_t c, char_class_type f) const {
            return std::iswctype(c, f);
        }
    };

    int main()
    {
        std::locale::global(std::locale("ja_JP.utf8"));
        std::wcout.sync_with_stdio(false);
        std::wcout.imbue(std::locale());

        std::wsmatch m;
        std::wstring in = L"けものフレンズ";
        // 匹配所有字符（它们被分类为 alnum ）
        std::regex_search(in, m, std::wregex(L"([[:alnum:]]+)"));
        std::wcout << "alnums: " << m[1] << '\n'; // 打印 "けものフレンズ"
        // 只匹配片假名
        std::regex_search(in, m,
                          std::basic_regex<wchar_t, wctype_traits>(L"([[:jkata:]]+)"));
        std::wcout << "katakana: " << m[1] << '\n'; // 打印 "フレンズ"
    }

输出：

    alnums: けものフレンズ
    katakana: フレンズ

### 参阅

isctype | 指示字符类中的成员关系指示 (公开成员函数)
wctype | 在当前 C 本地环境中查找字符分类类别 (函数)