31 Regular expressions library [re]

31.7 Class template regex_­traits [re.traits]

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);

Returns: char_­traits<charT>​::​length(p).

charT translate(charT c) const;

Returns: c.

charT translate_nocase(charT c) const;

Returns: use_­facet<ctype<charT>>(getloc()).tolower(c).

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().

Remarks: Ибо regex_­traits<char>, по крайней мере, 133 должны распознаваться узкие имена символов в Таблице . Поскольку regex_­traits<wchar_­t>, по крайней мере, 133 должны распознаваться имена широких символов в таблице .

bool isctype(charT c, char_class_type f) const;

Effects: Определяет, является ли персонаж c членом классификации символов, представленной f.

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;

Requires: Значение radix должно быть 8, 10 или 16.

Returns: значение, представленное цифрой ch в базе, radix если символ ch является действительной цифрой в базе radix; в противном случае возвращается -1.

locale_type imbue(locale_type loc);

Effects: Наполняет this копией локали loc. [ Note: Вызов imbue с локалью, отличной от используемой в настоящее время, делает недействительными все кэшированные данные, хранящиеся в *this. ] end note

Returns: если языковой стандарт ранее не был добавлен, то копия глобального языкового стандарта, действующего на момент создания *this, в противном случае - копия последнего переданного аргумента imbue.

Postconditions: getloc() == loc.

locale_type getloc() const;

Returns: если языковой стандарт не был добавлен, то копия глобального языкового стандарта, действующего на момент создания *this, в противном случае - копия последнего переданного аргумента imbue.

Таблица 133 - Имена классов символов и соответствующие ctype маски
Узкое имя персонажаИмя широкого символаСоответствующее 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:]].