Lua 二分法查找

-- 二分法查找
function ClientTestPage:binarySearch( value, t )

    local d = {} -- 默认数组,请使用(t),请注意数组必须为有序数组,不支持hash表查询
    for i = 1, 100 do
        d[i] = i
    end

    local minIndex = 1  -- 数组最小下标,lua默认从1开始
    local maxIndex = #d -- 数组最大下标
    local num = 1 -- 要查找的值,请使用(value)

    while true do
        local index = math.floor( ( minIndex + maxIndex ) /2) -- 计算数组中间元素下标

        if num == d[index] then
            return d[index]
        elseif num < d[index] then
            maxIndex = index - 1
        else
            minIndex = index + 1
        end
    end

    return nil
end

 

<think>我们正在讨论Lua字符串查找方法。根据用户提供的引用和问题,我们需要总结几种在Lua查找字符串的方法。 引用中提到了几种方法: 1. 使用string.find函数(引用[1]和引用[2]) 2. 处理特殊字符的查找(引用[3]中自定义的string.contains函数) 3. 引用[4]再次提到模式匹配和查找 因此,我们可以介绍以下几种方法: 1. 内置函数string.find:用于查找子串或模式匹配,返回起始和结束索引。 2. 处理特殊字符(如模式匹配字符)的查找:可以使用转义,或者像引用[3]那样逐个字节比较。 3. 使用string.match进行模式匹配,但这里用户主要问查找(即是否存在,位置在哪),所以重点在find。 另外,注意Lua字符串索引从1开始,且支持负数索引。 步骤: 1. 介绍string.find的基本用法。 2. 说明如何处理模式匹配字符(使用%转义)。 3. 提供自定义函数(如引用[3])来处理特殊字符的查找(不涉及模式匹配,纯字节比较)。 4. 简单提一下其他相关函数(如string.match)用于更复杂的模式匹配,但这不是重点。 注意:用户的问题中提到了“字符串查找”,所以重点在查找子串的位置。 我们将按照以下结构组织回答: - 方法1:使用内置函数string.find - 方法2:转义特殊字符后再使用string.find - 方法3:自定义函数(逐个字节比较)确保不将特殊字符视为模式 最后,给出使用建议。 注意:引用[3]中的函数名是string.contains,但实际功能是查找子串(返回布尔值),我们可以稍作修改使其返回位置,或者保持原样作为存在性检查。 用户可能需要知道位置,所以我们也可以提供一个返回位置的版本。 但是,引用[3]的函数只返回布尔值,我们可以修改它使其返回起始位置(如果找到的话)。 不过,为了简单,我们可以先介绍标准方法,然后说明自定义函数用于特殊需求。 开始编写回答。</think>### Lua 字符串查找方法详解 在 Lua 中进行字符串查找主要有以下几种方法,根据您的需求选择合适的方式: #### 1. **基础查找:`string.find()`** 最常用的字符串查找函数,返回子串的起始和结束位置: ```lua local str = "Lua Programming is fun!" local start_pos, end_pos = string.find(str, "Programming") print("起始位置:", start_pos, "结束位置:", end_pos) --> 起始位置:5 结束位置:15 ``` - **特点**: - 支持模式匹配(如 `%a` 匹配字母) - 可指定起始位置:`string.find(str, "fun", 10)` - 支持负索引(从末尾计算):`string.find(str, "fun", -10)`[^2][^4] #### 2. **安全查找(处理特殊字符)** 当字符串包含 `%`、`$` 等特殊字符时,使用转义或字节级比较: ```lua -- 方法1:转义特殊字符 local escaped_pattern = string.gsub("100%", "%%", "%%%%") local pos = string.find("Discount: 100% off", escaped_pattern) -- 方法2:字节级比较(推荐处理任意字符) function safe_find(str, substr) for i = 1, #str - #substr + 1 do if string.sub(str, i, i + #substr - 1) == substr then return i, i + #substr - 1 end end end print(safe_find("Price: $50", "$50")) --> 8,10 ``` 此方法源自引用[^3]的优化实现,避免模式匹配的特殊字符问题。 #### 3. **存在性检查:`string.match()`** 检查子串是否存在(不关心位置): ```lua if string.match("Hello World", "World") then print("包含目标字符串") end ``` #### 4. **高级模式匹配** 使用 Lua 模式进行复杂查找: ```lua -- 查找所有数字 local str = "ID: A123, Price: 45.6" for num in string.gmatch(str, "%d+%.?%d*") do print("找到数字:", num) --> 123, 45.6 end -- 邮箱验证 local email = "test@example.com" if string.match(email, "^[%w%.%-_]+@[%w%.%-_]+%.[%a]+$") then print("有效邮箱") end ``` #### 5. **反向查找技巧** 利用 `string.reverse()` 实现从末尾查找: ```lua local str = "apple,orange,banana" local rev_str = string.reverse(str) local rev_pos = string.find(rev_str, string.reverse("orange")) if rev_pos then local end_pos = #str - rev_pos + 1 local start_pos = end_pos - #"orange" + 1 print("最后出现位置:", start_pos, end_pos) end ``` 此方法结合了引用[^1]和[^2]的反向索引特性。 ### 使用建议 1. **简单查找** → 用 `string.find()` 2. **含特殊字符** → 用字节级比较的 `safe_find()` 3. **模式匹配** → 用 `string.match()` 或 `string.gmatch()` 4. **性能敏感场景** → 避免在循环中使用模式匹配,优先字节操作 > 示例中所有索引均遵循 Lua 规范:**起始索引为 1**(非 C 语言的 0),**负索引表示从末尾计算**(-1=最后一个字符)[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值