Tentei usar string.match("Í",'%s?[\u{4e00}-\u{9FFF}]+')
algo semelhante a como trabalhamos em JS ou outros. Mas corresponderá a um caractere desnecessário como o 'Í' acima.
A implementação oficial da correspondência de UTF-8 está usando eacape, \ddd
mas \u{XXX}
parece falhar porque
Os recursos de correspondência de padrões de Lua funcionam byte por byte
Temporariamente, eu uso a solução alternativa instável semelhante a utf8.charpattern
: string.match("Í",'%s?[\228-\233][%z\1-\191][%z\1-\191]')
com base na codificação utf8, a saída será executada nil
e funcionará para verificar cjk como '我', embora tenha um intervalo errado para o segundo byte da esquerda.
P:
Como resolver esse problema com regex?
%b
,%1
).\u{4e00}-\u{9FFF}
não funciona: o que Lua vê aqui é\228\184\128-\233\191\191
equivalente a\184\191\228\128-\233
, o que é muito diferente do que você deseja (notavelmente, o intervalo é repentinamente de\128
a\233
). Considero a interação de-
"caracteres" multibyte que aparecem como um único ponto de código nas fontes um pouco como uma arma de fogo.Como você deseja uma solução Lua pura, e dada a simplicidade do seu padrão, uma solução artesanal é viável: