UTF-8-Zeichenbereich in C ++ 11 Regex
Diese Frage ist eine Erweiterung vonFunktionieren reguläre C ++ 11-Ausdrücke mit UTF-8-Zeichenfolgen?
#include <regex>
if (std::regex_match ("中", std::regex("中") )) // "\u4e2d" also works
std::cout << "matched\n";
Das Programm wird auf Mac Mountain Lion mit kompiliertclang++
mit folgenden Optionen:
clang++ -std=c++0x -stdlib=libc++
Der obige Code funktioniert. Dies ist ein regulärer Standardbereich"[一-龠々〆ヵヶ]"
für das Zusammenbringen irgendeines japanischen Kanji oder chinesischen Schriftzeichens. Es funktioniert in Javascript und Ruby, aber ich kann scheinbar keine Bereiche in C ++ 11 zum Laufen bringen, selbst wenn ich eine ähnliche Version verwende[\u4E00-\u9fa0]
. Der folgende Code stimmt nicht mit der Zeichenfolge überein.
if (std::regex_match ("中", std::regex("[一-龠々〆ヵヶ]")))
std::cout << "range matched\n";
Das Ändern des Gebietsschemas hat auch nicht geholfen. Irgendwelche Ideen?
BEARBEITENAlso habe ich festgestellt, dass alle Bereiche funktionieren, wenn Sie eine hinzufügen+
bis zum Ende. In diesem Fall[一-龠々〆ヵヶ]+
, aber wenn Sie hinzufügen{1}
[一-龠々〆ヵヶ]{1}
es funktioniert nicht. Darüber hinaus scheint es seine Grenzen zu überschreiten. Es stimmt nicht mit lateinischen Zeichen überein, aber es stimmt übereinは
welches ist\u306f
undぁ
welches ist\u3041
. Sie liegen beide unten\u4E00
nhahtdh schlug auch regex_search vor, was auch ohne Hinzufügen funktioniert+
Es tritt jedoch immer noch das gleiche Problem wie oben auf, indem Werte außerhalb seines Bereichs gezogen werden. Spielte auch ein bisschen mit den Locales. Mark Ransom schlägt vor, die UTF-8-Zeichenfolge als eine dumme Menge von Bytes zu behandeln. Ich denke, dies ist möglicherweise das, was sie tut.
Die Theorie, dass UTF-8 in gewisser Weise durcheinander gerät, wird weiter vorangetrieben.[a-z]{1}
und[a-z]+
Streichhölzera
, aber nur[一-龠々〆ヵヶ]+
stimmt mit keinem der Zeichen überein, nicht mit[一-龠々〆ヵヶ]{1}
.