Zakres postaci UTF-8 w C ++ 11 Regex
To pytanie jest rozszerzeniemCzy wyrażenia regularne C ++ 11 działają z ciągami UTF-8?
#include <regex>
if (std::regex_match ("中", std::regex("中") )) // "\u4e2d" also works
std::cout << "matched\n";
Program jest kompilowany na Mac Mountain Lion zclang++
z następującymi opcjami:
clang++ -std=c++0x -stdlib=libc++
Powyższy kod działa. Jest to standardowe wyrażenie regularne"[一-龠々〆ヵヶ]"
za dopasowanie dowolnego japońskiego kanji lub chińskiego znaku. Działa w JavaScript i Ruby, ale nie wydaje mi się, aby zakresy działały w C ++ 11, nawet przy użyciu podobnej wersji[\u4E00-\u9fa0]
. Poniższy kod nie pasuje do łańcucha.
if (std::regex_match ("中", std::regex("[一-龠々〆ヵヶ]")))
std::cout << "range matched\n";
Zmiana ustawień regionalnych również nie pomogła. Jakieś pomysły?
EDYTOWAĆOdkryłem więc, że wszystkie zakresy działają, jeśli dodasz a+
do końca. W tym przypadku[一-龠々〆ヵヶ]+
, ale jeśli dodasz{1}
[一-龠々〆ヵヶ]{1}
to nie działa. Co więcej, wydaje się, że przekracza swoje granice. Nie pasuje do znaków łacińskich, ale pasujeは
który jest\u306f
iぁ
który jest\u3041
. Oboje leżą poniżej\u4E00
nhahtdh zasugerował również regex_search, które działa również bez dodawania+
ale nadal napotyka ten sam problem, co powyżej, ciągnąc wartości spoza swojego zakresu. Grałem też trochę z lokacjami. Mark Ransom sugeruje, że traktuje łańcuch UTF-8 jako głupi zestaw bajtów, myślę, że to prawdopodobnie robi.
Dalsze naciskanie na teorię, że UTF-8 się pomieszało, jak,[a-z]{1}
i[a-z]+
meczea
, lecz tylko[一-龠々〆ヵヶ]+
pasuje do żadnego z znaków, nie[一-龠々〆ヵヶ]{1}
.