Ответ 1
-
Использование регулярных выражений в строках ASCII - это использование "байтов" для поиска шаблона.
Использование регулярных выражений в строках UTF-8 - это использование регулярных выражений в "многобайтовых" последовательностях, где последовательность представляет собой кодовую точку Unicode.
Таким образом, регулярное выражение применяется к строке Unicode с кодировкой с байтом переменной байта на символ.
Строки UTF-8 содержат многобайтовые последовательности с 1 по 4 байта, которые представляют собой символ "Юникод". В UTF-8 только 7-разрядные символы ASCII имеют 1 байтовый "широкий".
Итак - с использованием механизма регулярных выражений ASCII в кодированной строке UTF-8, игнорирует многобайтовые последовательности в кодированной кодировке UTF-8 и вызывает сопоставление байт по байтам. Результаты этого использования механизма регулярного выражения ASCII в кодированной строке UTF-8 недействительны.
Посмотрите http://utfcpp.sourceforge.net.
Чтобы получить регулярные выражения, работающие с закодированными строками UTF-8, вам нужно...- Итераторы строк UTF-8 можно использовать с регулярными выражениями или
- используйте
std::codecvt_utf8
в комбинации временного назначения глобальной локали, чтобы заставить регулярное выражение работать, или - необходимо преобразовать кодированную строку UTF-8 в кодированную строку UTF-16, которая будет использоваться с движком регулярных выражений Unicode на основе std:: wstring.
-
Функция regex_search возвращает логическое значение и
true
в матче.
В вашем случае шаблон регулярного выражения ASCII соответствует части кодированной строки UTF-8, которая не обрабатывается как строка ASCII - как вы предполагали!
Если у вас есть текст на английском языке в кодировке UTF-8, то механизм регулярного выражения ASCII можно использовать безопасно. Оставляя ASCII 7-битный диапазон, делает результат работы механизма регулярного выражения ASCII ненадежным.