namespace std {
template <class charT>
struct regex_traits {
using char_type = charT;
using string_type = basic_string<char_type>;
using locale_type = locale;
using char_class_type = bitmask_type;
regex_traits();
static size_t length(const char_type* p);
charT translate(charT c) const;
charT translate_nocase(charT c) const;
template <class ForwardIterator>
string_type transform(ForwardIterator first, ForwardIterator last) const;
template <class ForwardIterator>
string_type transform_primary(
ForwardIterator first, ForwardIterator last) const;
template <class ForwardIterator>
string_type lookup_collatename(
ForwardIterator first, ForwardIterator last) const;
template <class ForwardIterator>
char_class_type lookup_classname(
ForwardIterator first, ForwardIterator last, bool icase = false) const;
bool isctype(charT c, char_class_type f) const;
int value(charT ch, int radix) const;
locale_type imbue(locale_type l);
locale_type getloc() const;
};
}
Специализации regex_traits<char> и regex_traits<wchar_t> должны быть действительными и должны удовлетворять требованиям, предъявляемым к классу свойств регулярного выражения ([re.req]).
using char_class_type = bitmask_type;
Тип char_class_type используется для представления классификации символов и может содержать набор для конкретной реализации, возвращаемый функцией lookup_classname.
static size_t length(const char_type* p);
charT translate(charT c) const;
charT translate_nocase(charT c) const;
template <class ForwardIterator>
string_type transform(ForwardIterator first, ForwardIterator last) const;
Effects: Как будто по:
string_type str(first, last); return use_facet<collate<charT>>( getloc()).transform(&*str.begin(), &*str.begin() + str.length());
template <class ForwardIterator>
string_type transform_primary(ForwardIterator first, ForwardIterator last) const;
Effects: Если
typeid(use_facet<collate<charT>>) == typeid(collate_byname<charT>)
и форма ключа сортировки, возвращаемого функцией collate_byname<charT>::transform(first, last) , известна и может быть преобразована в первичный ключ сортировки, затем возвращается этот ключ, в противном случае возвращается пустая строка.
template <class ForwardIterator>
string_type lookup_collatename(ForwardIterator first, ForwardIterator last) const;
Returns: последовательность из одного или нескольких символов, представляющая элемент сортировки, состоящий из последовательности символов, обозначенной диапазоном итератора [first, last). Возвращает пустую строку, если последовательность символов не является допустимым элементом сортировки.
template <class ForwardIterator>
char_class_type lookup_classname(
ForwardIterator first, ForwardIterator last, bool icase = false) const;
Returns: неопределенное значение, представляющее классификацию символов, названную последовательностью символов, обозначенной диапазоном итератора [first, last). Если параметр icase равен, true то возвращаемая маска идентифицирует классификацию символов без учета регистра сопоставляемых символов, в противном случае учитывает регистр сопоставляемых символов.329 Возвращаемое значение не должно зависеть от регистра символов в последовательности символов. Если имя не распознано, возвращается char_class_type().
bool isctype(charT c, char_class_type f) const;
Returns: Учитывая следующее объявление функции:
// for exposition only
template<class C>
ctype_base::mask convert(typename regex_traits<C>::char_class_type f);
который возвращает значение, в котором установлено каждое ctype_base::mask значение, соответствующее значению в f названии в таблице 133 , тогда результат определяется, как если бы:
ctype_base::mask m = convert<charT>(f); const ctype<charT>& ct = use_facet<ctype<charT>>(getloc()); if (ct.is(m, c)) { return true; } else if (c == ct.widen('_')) { charT w[1] = { ct.widen('w') }; char_class_type x = lookup_classname(w, w+1); return (f&x) == x; } else { return false; }
[ Example:
regex_traits<char> t;
string d("d");
string u("upper");
regex_traits<char>::char_class_type f;
f = t.lookup_classname(d.begin(), d.end());
f |= t.lookup_classname(u.begin(), u.end());
ctype_base::mask m = convert<char>(f); // m == ctype_base::digit|ctype_base::upper
— end example ] [ Example:
regex_traits<char> t; string w("w"); regex_traits<char>::char_class_type f; f = t.lookup_classname(w.begin(), w.end()); t.isctype('A', f); // returns true t.isctype('_', f); // returns true t.isctype(' ', f); // returns false
— end example ]
int value(charT ch, int radix) const;
Returns: значение, представленное цифрой ch в базе, radix если символ ch является действительной цифрой в базе radix; в противном случае возвращается -1.
locale_type imbue(locale_type loc);
Effects: Наполняет this копией локали loc. [ Note: Вызов imbue с локалью, отличной от используемой в настоящее время, делает недействительными все кэшированные данные, хранящиеся в *this. ] — end note
Returns: если языковой стандарт ранее не был добавлен, то копия глобального языкового стандарта, действующего на момент создания *this, в противном случае - копия последнего переданного аргумента imbue.
locale_type getloc() const;
Returns: если языковой стандарт не был добавлен, то копия глобального языкового стандарта, действующего на момент создания *this, в противном случае - копия последнего переданного аргумента imbue.
Узкое имя персонажа | Имя широкого символа | Соответствующее ctype_base::mask значение |
"alnum" | L"alnum" | ctype_base::alnum |
"alpha" | L"alpha" | ctype_base::alpha |
"blank" | L"blank" | ctype_base::blank |
"cntrl" | L"cntrl" | ctype_base::cntrl |
"digit" | L"digit" | ctype_base::digit |
"d" | L"d" | ctype_base::digit |
"graph" | L"graph" | ctype_base::graph |
"lower" | L"lower" | ctype_base::lower |
"print" | L"print" | ctype_base::print |
"punct" | L"punct" | ctype_base::punct |
"space" | L"space" | ctype_base::space |
"s" | L"s" | ctype_base::space |
"upper" | L"upper" | ctype_base::upper |
"w" | L"w" | ctype_base::alnum |
"xdigit" | L"xdigit" | ctype_base::xdigit |
Например, если параметр icase является true то [[:lower:]] такой же , как [[:alpha:]].