用 Lua 提取被 Unicode 空格和控制字符分割的单词
2021-3-2 22:14:45
收藏:0
阅读:181
评论:1
我需要一个纯 Lua (即没有使用外部 Unicode 库)的解决方案,用于提取字符串中某些 Unicode 控制字符和空格之间的单位。我想要作为分隔符使用的代码点如下:
0000-0020 007f-00a0 00ad 1680 2000-200a 2028-2029 202f 205f 3000
我知道如何访问字符串中的代码点,例如:
> for i,c in utf8.codes("é$ \tπ") do print(c) end
233
36
32
9
960
128515
但是我不确定如何“跳过”空格和制表符,并将其他代码点重组成字符串本身。在上面的示例中,我想删除 32 和 9,然后使用 utf8.char(233, 36) 和 utf8.char(960, 128515) 以某种方式获取 ["é$", "π"]。
似乎将所有内容放入数字表格中,并仔细遍历该表格以实现 for 循环和 if 语句是可行的,但是否有更好的方法?我尝试使用 string:gmatch,但那似乎要求我将我想要的每个区间都转换为 utf8 序列,而且不清楚该模式甚至看起来像什么。
是否有一种惯用的方法来提取空格之间的字符串?还是必须手动处理代码点表格? gmatch 看起来不适合这项任务。是这样吗?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

需要耗费大量的工作来为每个范围的代码点生成UTF8编码。
是的,但当然不需要手动完成。
local function range(from, to) assert(utf8.codepoint(from) // 64 == utf8.codepoint(to) // 64) return from:sub(1,-2).."["..from:sub(-1).."-"..to:sub(-1).."]" end local function split_unicode(s) for w in s :gsub("[\0-\x1F\x7F]", " ") :gsub("\u{00a0}", " ") :gsub("\u{00ad}", " ") :gsub("\u{1680}", " ") :gsub(range("\u{2000}", "\u{200a}"), " ") :gsub(range("\u{2028}", "\u{2029}"), " ") :gsub("\u{202f}", " ") :gsub("\u{205f}", " ") :gsub("\u{3000}", " ") :gmatch"%S+" do print(w) end end测试:
split_unicode("@\0@\t@\x1F@\x7F@\u{00a0}@\u{00ad}@\u{1680}@\u{2000}@\u{2005}@\u{200a}@\u{2028}@\u{2029}@\u{202f}@\u{205f}@\u{3000}@")