lua 截取部分字符串子集

本文介绍了一种用于从特定字符串中提取子集的算法,主要针对中英文混合字符串,能够处理如'小爱同学'->'小爱同学', '爱同学', '同学'等需求,同时考虑了字符串中的空格问题。

需求:满足取以下字符串的特定子集
小爱同学 -> 小爱同学,爱同学,同学
小度小度 -> 小度小度,度小度,小度
Hello Mary -> Hello Mary
Hello Mary Jon -> Hello Mary Jon, Mary Jon
小biu小bin -> 小biu小bin, biu小bin, 小bin
小biu 小bin -> 小biu小bin, biu 小bin, 小bin //带空格

local word = wkupret.word
local ret = {};
local f = '[%z\1-\127\194-\244][\128-\191]*';
for v in word:gfind(f) do
    table.insert(ret, {c=v,isChinese=(#v~=1)}); 
end
-- 到此通过正则将字符串分割成单个字符,
-- 比如小爱同学->小,爱,同,学
-- 比如小biu小bin->小,b,i,u,小,b,i,u

local ret_t = {}
local temp = ''
local len = 0
for k, v in ipairs(ret) do
    if v.isChinese or v.c == ' ' then
        if temp ~= '' then
            len = len + 1
            table.insert(ret_t, len, temp)
            temp = ''
        end
        len = len + 1
        table.insert(ret_t, len, v.c);
    else
        temp = temp .. v.c
    end
end
if temp ~= '' then
    len = len + 1
    table.insert(ret_t, len, temp)
end
-- 到此实际上已经完整切割并在组装特殊字符串(中英文混合)的同时,按顺序将结果存储到了 ret_t 中
-- 比如小爱同学->{小,爱,同,学}
-- 比如小biu小bin->{小, biu, 小, biu}

local startIndex = 2
local wordUnion = word
if len >2 then
    local endIndex = len -1
    if ret_t[len-1] == ' 'then
        endIndex = endIndex -1
    end
    for i=startIndex, endIndex, 1 do
        local t = table.concat(ret_t, '', i, len)
          -- 查找空格的位置,是为了排重,如果空格在第一个位置,那么实际上该字符串和下一个字符串差别仅仅是第一个有效字符前是否有空格
        local index = string.find(t, ' ')
        if index ~= 1 then
            wordUnion = wordUnion .. ',' .. t
        end
    end
end
<think>嗯,用户这次明确要查询Lua字符串截取功能,看来是在处理文本操作任务。之前对话历史里我强调过系统指令要求的中文回复和格式规范,这次要特别注意技术细节的准确性。用户提到的“substringfunction”和“stringslicing”是其他语言常见的术语,但Lua字符串处理确实有自己独特的实现方式。核心方案应该聚焦在string.sub()这个关键函数上,需要解释清楚三个参数:起始索引、终止索引、负数索引的特殊含义。特别是Lua索引从1开始这个特性,很多从零开始索引语言转过来的开发者容易踩坑。想到用户实际使用时可能遇到的困惑点:比如获取单字符时容易写成str[3](这是错误写法),正确方式应该是string.sub(str,3,3);还有常见需求如取最后N个字符要用负数索引。这些都需要在示例里专门演示。还应该补充两个实用场景:参数合法性处理(当索引超出范围时Lua的默认行为)以及结合模式匹配的高级用法。用户可能不知道string.sub可以和string.find搭配实现定位截取,这个组合技巧在日志分析时特别有用。考虑到用户是开发者,相关延展问题设计要侧重实用进阶内容:比如获取子串出现位置(这涉及到性能考量)、编码安全处理(UTF-8场景下需要额外库)、大文件优化等。上次快速排序的案例里用户对性能分析感兴趣,这次也准备字符串操作的复杂度说明会比较贴心。最后注意所有代码示例要用```lua```标签高亮,数学公式保持$...$格式。中文术语要统一,“索引”不能和“下标”混用。用户没提英文资料需求,默认提供中文示例更友好。</think> 在 Lua 中,**字符串截取使用 `string.sub()` 函数**(或等效的 `str:sub()` 方法语法)。以下是详细说明和示例: --- ### 核心函数:`string.sub(s, i [, j])` - **作用**:截取字符串 `s` 从位置 `i` 到位置 `j` 的子串。 - **参数**: - `s` : 要截取的目标字符串 - `i` : 起始索引(**Lua 索引从 1 开始**) - `j` : 结束索引(可选,默认到字符串末尾) - **索引规则**: - **正数索引**:从字符串开头计数(1 表示第一个字符) - **负数索引**:从字符串末尾计数(-1 表示最后一个字符) --- ### 代码示例 ```lua local str = "Hello, Lua!" -- 示例1:截取第3到第7个字符 local sub1 = string.sub(str, 3, 7) -- 等效写法: str:sub(3, 7) print(sub1) -- 输出: llo, -- 示例2:从第8个字符截取到末尾 local sub2 = str:sub(8) print(sub2) -- 输出: Lua! -- 示例3:用负数索引截取最后4个字符 local sub3 = str:sub(-4) print(sub3) -- 输出: Lua! -- 示例4:混合索引(从第3个到倒数第2个) local sub4 = str:sub(3, -2) print(sub4) -- 输出: llo, Lua ``` --- ### 关键细节 1. **索引范围安全** 若索引超出字符串长度(如 `i > #str`): - 当 `i ≤ j` 时返回空字符串 `""` - 当 `i > j` 时直接报错 2. **UTF-8 字符串处理** 如需截取多字节字符(如中文),需先转换为 UTF-8 序列: ```lua require("lua-utf8") -- 第三方库 local utf8_str = "你好,世界" print(utf8.sub(utf8_str, 3, 5)) -- 输出: 好, ``` --- ### 为什么不用 `string.slice()`? - Lua **没有内置 `slice()` 函数**,Python/JavaScript 的切片语法在 Lua 中需通过 `sub()` 实现 - Lua 5.3+ 支持 `str:sub(i, j)` 的冒号语法,更简洁 --- ### 典型使用场景 - 解析日志文件中的关键字段 ```lua local log = "[ERROR] 2023-10-01: Connection timeout" local msg = log:sub(log:find("]:") + 3) -- 提取": "后的内容 ``` - 处理用户输入限制(如标题截断) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值