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) 首先以实现定义方式转换 fstd::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() 获得的位掩码

返回值

cf 分类则为 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: フレンズ


参阅

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