Диапазон символов UTF-8 в C ++ 11 Regex
Этот вопрос является продолжениемРаботают ли регулярные выражения C ++ 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, но я не могу заставить работать диапазоны в C ++ 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}
.