Этот вопрос является расширением Выполняют ли регулярные выражения С++ 11 строки UTF-8?
#include <regex>
if (std::regex_match ("中", std::regex("中") )) // "\u4e2d" also works
std::cout << "matched\n";
Программа скомпилирована на Mac Mountain Lion с помощью clang++
со следующими параметрами:
clang++ -std=c++0x -stdlib=libc++
Выполняется код выше. Это стандартное регулярное выражение "[一-龠々〆ヵヶ]"
для сопоставления любого японского иероглифа или иероглифа. Он работает в Javascript и Ruby, но я не могу заставить диапазоны работать на С++ 11, даже используя аналогичную версию [\u4E00-\u9fa0]
. Код ниже не соответствует строке.
if (std::regex_match ("中", std::regex("[一-龠々〆ヵヶ]")))
std::cout << "range matched\n";
Изменение языкового стандарта также не помогло. Любые идеи?
ИЗМЕНИТЬ
Итак, я обнаружил, что все диапазоны работают, если вы добавите +
в конец. В этом случае [一-龠々〆ヵヶ]+
, но если вы добавите {1}
[一-龠々〆ヵヶ]{1}
, это не сработает. Более того, он, кажется, преодолевает его границы. Он не будет соответствовать латинским символам, но он будет соответствовать は
, который равен \u306f
и ぁ
, который равен \u3041
. Оба они лежат ниже \u4E00
nhahtdh также предложил regex_search, который также работает без добавления +
, но он по-прежнему сталкивается с той же проблемой, что и выше, вытягивая значения за пределами своего диапазона. Играл с локалями немного. Марк Рэнсом предлагает, чтобы он рассматривал строку UTF-8 как немой набор байтов, я думаю, что это возможно, что он делает.
Дальнейшее продвижение теории о том, что UTF-8 начинает смешиваться, как [a-z]{1}
и [a-z]+
соответствует a
, но только [一-龠々〆ヵヶ]+
соответствует любому из символов, а не [一-龠々〆ヵヶ]{1}
.