我尝试使用string.match("Í",'%s?[\u{4e00}-\u{9FFF}]+')
类似于我们在 JS 或其他语言中工作的方式。但它会匹配一个不必要的字符,如上面的“Í”。
匹配 UTF-8 的官方实现是使用 eacape\ddd
但\u{XXX}
似乎失败了,因为
Lua 的模式匹配工具逐字节工作
暂时,我使用类似于以下的不稳定解决方法utf8.charpattern
:string.match("Í",'%s?[\228-\233][%z\1-\191][%z\1-\191]')
基于utf8 编码将输出nil
并用于检查 cjk(如“我”),尽管它的左起第二个字节有一个错误的范围。
问:
如何用正则表达式解决这个问题?
%b
,%1
)。\u{4e00}-\u{9FFF}
行不通的原因:Lua 在这里看到的是\228\184\128-\233\191\191
,相当于\184\191\228\128-\233
,这与你想要的非常不同(值得注意的是,范围突然从\128
到\233
)。我认为与在源代码中显示为单个代码点的多字节“字符”的交互-
有点像枪炮。由于您想要一个纯 Lua 解决方案,并且考虑到您的模式的简单性,因此手工解决方案是可行的: