Intervalo de caracteres UTF-8 em C ++ 11 Regex
Esta questão é uma extensão deAs expressões regulares do C ++ 11 funcionam com strings UTF-8?
#include <regex>
if (std::regex_match ("中", std::regex("中") )) // "\u4e2d" also works
std::cout << "matched\n";
O programa é compilado no Mac Mountain Lion comclang++
com as seguintes opções:
clang++ -std=c++0x -stdlib=libc++
O código acima funciona. Este é um regex de intervalo padrão"[一-龠々〆ヵヶ]"
para corresponder a qualquer Kanji japonês ou caractere chinês. Ele funciona em Javascript e Ruby, mas não consigo obter intervalos trabalhando em C ++ 11, mesmo com o uso de uma versão similar[\u4E00-\u9fa0]
. O código abaixo não corresponde à string.
if (std::regex_match ("中", std::regex("[一-龠々〆ヵヶ]")))
std::cout << "range matched\n";
Mudar localidade também não ajudou. Alguma ideia?
EDITAREntão, descobri que todas as faixas funcionam se você adicionar+
até o fim. Nesse caso[一-龠々〆ヵヶ]+
, mas se você adicionar{1}
[一-龠々〆ヵヶ]{1}
não funciona. Além disso, parece ultrapassar seus limites. Não combina com caracteres latinos, mas corresponderáは
qual é\u306f
eぁ
qual é\u3041
. Ambos estão abaixo\u4E00
nhahtdh também sugeriu regex_search que também funciona sem adicionar+
mas ainda corre o mesmo problema acima, puxando valores fora de seu alcance. Jogado com os locais um pouco também. Mark Ransom sugere que ele trate a string UTF-8 como um conjunto estúpido de bytes, acho que isso é possivelmente o que ela está fazendo.
Continuando a teoria de que o UTF-8 está se confundindo de alguma forma,[a-z]{1}
e[a-z]+
fósforosa
, se apenas[一-龠々〆ヵヶ]+
corresponde a qualquer um dos caracteres, não[一-龠々〆ヵヶ]{1}
.