кириллицы c буквы представлены в UTF-8 в виде многобайтовых последовательностей. Поэтому одним из способов решения этой проблемы является использование "широкой" версии string
, называемой wstring
. Другие функции и типы, работающие с широкими символами, также необходимо заменить их «многобайтовой» версией, обычно это делается путем добавления w
к их имени. Это работает:
std::locale::global(std::locale("en_US.UTF-8"));
wstring s {L"Каждый охотник желает знать где сидит фазан."};
wregex re {L"[А-Яа-яЁё]+"};
for (wsregex_iterator it {s.begin(), s.end(), re}, end {}; it != end; it++) {
wcout << it->str() << "#";
}
Вывод:
Каждый#охотник#желает#знать#где#сидит#фазан#
(Спасибо @JohnDing за предоставление этого решения.)
Альтернативное решение заключается в использовании
regex::collate
для создания регулярных выражений locale- чувствителен к обычным строкам, см.
этот ответ @OlafDietsche для деталей.
Эта топика c позволит пролить свет на то, какое решение может быть более предпочтительным в ваших обстоятельствах. (Оказывается, в моем случае
collate
была лучшей идеей!)