首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么lua string.find返回错误的数字

string.find 是 Lua 中的一个字符串处理函数,用于在一个字符串中查找指定的子串。如果找到了匹配的子串,它会返回子串在原字符串中的起始位置和结束位置的索引;如果没有找到,则返回 nil

如果你发现 string.find 返回了错误的数字,可能是以下几个原因造成的:

1. 字符串编码问题

Lua 默认使用 UTF-8 编码处理字符串。如果你的字符串使用了其他编码,可能会导致查找结果不正确。

2. 查找模式问题

string.find 支持使用模式匹配(类似于正则表达式),如果模式写错了,也会导致返回错误的结果。

3. 索引计算问题

Lua 中字符串的索引是从 1 开始的,而不是像某些语言那样从 0 开始。如果你按照从 0 开始的索引来解读返回的结果,就会得到错误的数字。

解决方法

检查字符串编码

确保你的字符串和查找的子串都是 UTF-8 编码。

检查查找模式

如果你使用了模式匹配,确保模式是正确的。例如,如果你想查找一个精确的子串,应该这样写:

代码语言:txt
复制
local str = "Hello, world!"
local start_pos, end_pos = string.find(str, "world")

如果你想查找包含任意字符的子串,可以使用通配符 %

代码语言:txt
复制
local str = "Hello, world!"
local start_pos, end_pos = string.find(str, "w%rld")

正确解读索引

记住 Lua 中的索引是从 1 开始的。如果你需要将索引转换为从 0 开始的索引,可以这样做:

代码语言:txt
复制
local str = "Hello, world!"
local start_pos, end_pos = string.find(str, "world")
local zero_based_start_pos = start_pos - 1
local zero_based_end_pos = end_pos - 1

示例代码

下面是一个完整的示例,展示了如何正确使用 string.find 并解读其返回值:

代码语言:txt
复制
local str = "Hello, world!"
local pattern = "world"

local start_pos, end_pos = string.find(str, pattern)

if start_pos then
    print("找到匹配的子串,起始位置:" .. start_pos .. ",结束位置:" .. end_pos)
else
    print("没有找到匹配的子串")
end

如果你按照以上步骤检查并修正了问题,string.find 应该能够返回正确的结果。如果仍然有问题,可能需要进一步检查代码逻辑或提供更多的上下文信息来诊断问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

lua语言:类型,基本语法,函数

Numbers 表示实数,Lua 中没有整数。一般有个错误的看法 CPU 运算浮点数比整数慢。事实 不是如此,用实数代替整数不会有什么误差(除非数字大于 100,000,000,000,000)。...在 Lua 中如果你想调用可变参数的可 变函数只需要这样: f(unpack(a)) unpack 返回 a 所有的元素作为 f()的参数 f = string.find a = {"hello...举个具体的例子,如果我们只想要 string.find 返回的第二个值。...,errHandleFun),参数是被调用函数,错误函数处理 2.执行结果 pcall:返回错误信息时,已经释放了保存错误发生情况的栈信息。...xpcall:会在栈信息释放之前调用错误处理程序(可以使用debug库收集错误信息) 3.返回结果 pcall 返回 nil , 错误信息 xpcall返回nil , 无错误信息 local fun

45410
  • H7-TOOL的LUA小程序教程第2期:变量,循环,函数,条件语句和字符串相关API

    LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用...TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。 掌握这些基础就够用了。...把nil,false视为假,其他都为true 4.Lua中的变量全是全局变量,除非用 local 显式声明为局部变量 5....#ta字符串的长度,也可以获取表格数字索引对应的个数 例子 --全局赋值 x = 1 --局部多个赋值 local x,y = 1,2 local ta = {1,2,3,name='安富莱'...string.char是把ascii数值转换成字符 例子 --返回98所对应的字符 local r = string.char(98) --a --返回98,,99,100对应的字符并连在一起返回 local

    1.1K30

    Lua 语法基础 | Nmap 脚本

    Lua 允许一个函数返回多个值,很多预定义函数就是这样,比如string.find() s, e = string.find("hello Lua users", "Lua") print(s, e)...,比如搜索一个单词 string.find 存在四个参数:字符串、查找的模式、位置、是否简单检索 其中简单检索就是不在乎模式,直接查找字符串 函数返回两个值,即匹配到的开始和结束值,没有匹配到返回nil...,如果为真返回第一个参数,如果为假则引发一个错误 以打开文件为例 io.open,打开一个不存在的文件会导致错误,返回false,可以如下处理 -----------------------------...,以便捕获该函数执行的错误,无论是否有错误产生,函数pcall都不会产生错误 如果没有错误产生会返回 true 以及被调用的函数的所有返回值,否则返回false 以及错误信息(错误信息是一个对象) 13...pcall 一样,resume 函数也是运行在保护模式中,因此,协程如果执行过程中出错,Lua 语言不会显示错误信息,而是将错误信息返回给函数 resume 当协程A唤醒协程B的时候,协程A既不是挂起状态

    2.1K50

    3-51单片机WIFI学习(开发板8266底层源码介绍)

    上一篇链接  http://www.cnblogs.com/yangfengwu/p/8743502.html 直接上源码:注意源码有两部分,第一部分是一开始的时候写在模块内部的,另一部分是存在手机内部的...,方便后期更新功能 看第一部分的源码 亲们可以直接把下面的第一部分(注意只下载第一部分就行)的程序下载到8266里面就可以用自己的APP实现远程控制 怎么下载看我以前的文章,LUA开发的 ?...关于SNTP获取网络时间的问题,用阿里的博客写的 https://yq.aliyun.com/articles/511601?...直接把源码一贴,不好讲了,因为涉及的多...所以还是看后期自己一点一点的写源码吧 现在贴上第二部分源码,也就是存在手机上的,手机上就是这样存的,前面一点是接收用户配置的MQTT和WIFI的一些信息,所以做成这样子了...其实只要会基本的功能了,其余的都是看个人的发挥了

    1.3K61

    包验证返回的错误代码

    本文仅供参考,其中列出了由包验证生成的所有错误代码。 错误代码列表 诊断 ID 说明 建议的操作 PKV0001 缺少兼容框架的编译时资产。 将适当的目标框架添加到项目中。...PKV0002 缺少兼容框架和运行时的运行时资产。 将相应运行时的适当资产添加到包中。 PKV0003 缺少兼容框架的运行时独立资产。 将适当的运行时独立目标框架添加到项目中。...PKV0004 缺少编译时资产的兼容运行时资产。 将适当的运行时资产添加到包中。 PKV0005 缺少编译时资产的兼容运行时资产和受支持的运行时标识符。 将适当的运行时资产添加到包中。...CP0001 所比较的程序集中缺少该程序集外部可见的所需类型、枚举、记录或结构。 将缺少的类型添加到缺少该类型的程序集中。 CP0002 所比较的程序集中缺少在该程序集外部可见的所需成员。...将缺少的成员添加到缺少该成员的程序集中。 CP0003 程序集标识的某些部分(名称、公钥令牌、区域性、可重定目标属性或版本)对于比较的双方都不匹配。 更新程序集标识,以便比较的双方都匹配。

    1.8K30

    OpenProcess打开进程返回错误的问题

    于是乎,打开调试器下了几个断点跟了进去发现:GetLastError()的返回值在遇到System Process时,会返回错误代码87。...回头一查MSDN,人家已然说明:当OpenProcess()给定的进程ID为0时,该函数会失败并且GetLastError()返回的错误代码是ERROR_INVALID_PARAMETER。...另外还说明了,当给定的进程是空闲进程(Idle Process)或CSRSS进程之一时,GetLastError()返回的错误代码是ERROR_ACCESS_DENIED,其值为5....显然,错误很明显了。我并没有过滤这些特殊进程,而是一股脑的全部调用OpenProcess()打开进程。而刚好,我的系统上第一个遍历的进程就是System Process(进程ID为0)。...另外,我的系统是Windows 7 64位系统,网上有人说在Windows XP系统上不会出现这种错误,不知道真假。

    3.3K100

    该洞只存在于老版本固件中!!!!!

    lua代码审计记录 某3C G3系列 REC 路由器 在网上翻着翻着 翻到lua的源码 那就审审看 意外发现一个老版本固件中存在的洞 该洞只存在于老版本固件中!!!!!...1、利用条件 登录 该漏洞存在与后台的 tracert中 访问该路由需要登录 在登录时 有的用户会把 密码放到提示中 利用该条件可以正常登录后台 同时 在验证码方面 在访问验证码的url后会直接返回 密码提示...shell指令导致的 在最新版固件中 加了check_Host函数用于检测输入的正确性 function check_Host(HostName) local checkresult = 1...i = 0 if HostName == nil then checkresult = 0 return checkresult end if string.find...= nil then checkresult = 0 return checkresult end while true do i = string.find

    8510

    为什么getTime()返回1970年至今的毫秒?

    今天在写new Date()时候,无意中发现了一个很有意思的方法,getTime(),百度了一下,有人说是计算从1970年1月1日至今的毫秒数 为什么要是1970年呢?...为什么这个时间会定义在1970年1月1日这个时候呢? 于是开始了Google,中文网页根本找不到答案。...但这依然没很好的解释"为什么",出于好奇,继续Google,总算找到了答案: http://en.wikipedia.org/wiki/Unix_time 这里的解释是: 最初计算机操作系统是32位,而时间也是用...到这里,我想问题的答案已经出来了: 因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间...区,故打印的结果是8点。

    1.2K30

    nginx动态proxy_pass

    有时我们想根据用户请求的参数转发到不同的upstream,像做多机房用户路由的时候是非常有用的,实现有多种方式,一是设置不同的loction,然后让lua动态执行不同的子请求;还有就是将upstream...指令设置变量ups,然后请求到ups变量指向的upstream中,lua代码如下: --ip to hash函数 function iptolong(ip) local first_index...while true do first_index,_ = string.find(ip, split_str, last_index) if nil == first_index...iptolong(ip) % 2; if ip_hash == 1 then return "order1" else return "order0" end 上面我们根据用户IP做一次路由,偶数的返回...order0,反之返回order1,这样不同的IP返回不同的upstream了;然后可以在浏览器访问 aa.com的一个地址,可以让每个服务器返回不同的东西就可以看到效果了。

    4.1K50

    Lua string.gsub (1)

    Lua中的模式匹配用正则表达式来描述,它被用于string.find, string.gmatch,string.gsub, 和string.match.匹配一种模式。...字母,代表[a-zA-Z] 字符,对所有符号的统称 字母数字表,字母和数字的统称 空白(空格)字符:例如(‘ ’,'\t’) 字符集:一个字符集用于代表一些字符的集合。...:代表所有的标点符号; %s:代表所有的空白字符; %u:代表所有的大写字母; %w:代表所有字母表中的字符; %x:代表所有的十六进制数字; %x:(x不是字母数字表中的字符)代表x字符本身。...比如,[%w_](或者)[_%w]代表所有的字母数字表中的字符和下划线组成的集合,[0-7]代表八进制,[0-7%l%-]代表八进制数字、小写字母以及‘-’字符组成的集合。...你可以在一个字符集中的开头位置放置一个].你也可以在一个字符集的开头或者结束放置一个连字符。(你也可以在两种情况中加入转义字符) 字符区间和字符集合有交叉的情况下,你写的模式匹配是错误的。

    97720
    领券