Diese Frage ist eine Erweiterung von Do C++11 regular expressions work with UTF-8 strings?Bereich von UTF-8-Zeichen in C++ 11 Regex
#include <regex>
if (std::regex_match ("中", std::regex("中"))) // "\u4e2d" also works
std::cout << "matched\n";
Das Programm auf dem Mac Mountain Lion mit clang++
mit den folgenden Optionen kompiliert wird:
clang++ -std=c++0x -stdlib=libc++
Der obige Code funktioniert. Dies ist ein Standardbereich Regex "[一-龠々〆ヵヶ]"
für den Abgleich von japanischen Kanji oder chinesischen Schriftzeichen. Es funktioniert in Javascript und Ruby, aber ich kann nicht scheinen Bereiche in C++ 11 arbeiten, auch mit einer ähnlichen Version [\u4E00-\u9fa0]
. Der folgende Code stimmt nicht mit der Zeichenfolge überein.
if (std::regex_match ("中", std::regex("[一-龠々〆ヵヶ]")))
std::cout << "range matched\n";
Das Ändern der Ländereinstellung hat auch nicht geholfen. Irgendwelche Ideen?
EDIT
So fand ich, dass alle Bereiche, wenn Sie eine +
bis zum Ende hinzuzufügen. In diesem Fall [一-龠々〆ヵヶ]+
, aber wenn Sie {1}
[一-龠々〆ヵヶ]{1}
hinzufügen funktioniert es nicht. Außerdem scheint es seine Grenzen zu überschreiten. Es wird nicht lateinischen Zeichen entsprechen, aber es wird は
entsprechen, das ist \u306f
und ぁ
das \u3041
ist. Sie liegen beide unter \u4E00
nhahtdh schlug auch regex_search vor, das auch funktioniert, ohne +
hinzuzufügen, aber es läuft immer noch in das gleiche Problem wie oben, indem es Werte außerhalb seines Bereichs zieht. Gespielt mit den Locales auch ein bisschen. Mark Ransom schlägt vor, dass es die UTF-8-Zeichenfolge als eine dumme Menge von Bytes behandelt, ich denke, dass dies möglicherweise das ist, was sie tut.
schieben Weitere die Theorie, dass UTF-8 ist etwas, wie durcheinander bekommen, [a-z]{1}
und [a-z]+
a
Matches, aber nur [一-龠々〆ヵヶ]+
Matches eines der Zeichen, nicht [一-龠々〆ヵヶ]{1}
.
Was ist der Compiler? – nhahtdh
clang ++ -std = C++ 0x -stdlib = libC++ auf Mac Mountain Lion – MCH
Einige Experimente und ich habe eine Lösung gefunden, fügen Sie '+' am Ende des Bereichs – MCH