# std::regex_traits<CharT>::isctype

< cpp‎ | regex‎ | regex traits

bool isctype( CharT c, char_class_type f ) const; |  |

确定字符 `c` 是否属于 `f` 所标识的字符类，即为 lookup_classname() 所返回的值或几个这种值的逐位或。

std::regex_traits 的标准库特化中提供的此函数版本进行下列动作：

1) 首先以实现定义方式转换 `f` 为 std::ctype_base::mask 类型临时值 `m`
2) 然后试图以感染的本地环境分类字符，通过调用 std::use_facet<std::ctype<CharT>>(getloc()).is(m, c) 。若它返回 true ，则 `isctype()` 返回 true 。
3) 否则，检查 `c` 是否等于 `'_'` 且位掩码 `f` 是否包含对字符类 `[:w:]` 调用 lookup_classname() 的结果，该情况下返回 true 。
4) 否则，返回 `false` 。

### 参数

c | - | 要分类的字符
f | - | 从一或多次调用 lookup_classname() 获得的位掩码

### 返回值

若 `c` 以 `f` 分类则为 true ，否则为 false 。

### 注意

以上描述摘要 C++14 ； C++11 用语要求此函数在所有情况下对 `'_'` 返回 true （ LWG 问题 2018 ）。

### 示例

    #include <iostream>
    #include <string>
    #include <regex>

    int main()
    {
        std::regex_traits<char> t;
        std::string str_alnum = "alnum";
        auto a = t.lookup_classname(str_alnum.begin(), str_alnum.end());
        std::string str_w = "w"; // [:w:] 为 [:alnum:] 加上 '_'
        auto w = t.lookup_classname(str_w.begin(), str_w.end());
        std::cout << std::boolalpha
                  << t.isctype('A', w) << ' ' << t.isctype('A', a) << '\n'
                  << t.isctype('_', w) << ' ' << t.isctype('_', a) << '\n'
                  << t.isctype(' ', w) << ' ' << t.isctype(' ', a) << '\n';
    }

输出：

    true true
    true false
    false false

演示定制 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: フレンズ

### 参阅

lookup_classname | 以名获得字符类 (公开成员函数)
do_is [虚] | 分类字符或字符序列 (`std::ctype<CharT>` 的虚受保护成员函数)
iswctype | 按照指定的 LC_TYPE 类别分类宽字符 (函数)