Lua string函数说明

本文详细介绍了Lua语言中字符串处理的各种内置函数,包括字符串查找、替换、格式化等实用功能,并通过具体示例展示了如何运用这些函数来高效地完成字符串操作任务。

string函数

string.byte (s,[,i[,j]])

返回字符串内部编码s[i],s[i+1],...,s[j]。i默认是1,j默认是i;
和|string.sub|规则相同。内部编码不一定可移植。      
string.byte("hello",1,5)
在mac上返回104,101,108,108,111

string.char (…)

接收零个或多个整数。返回由参数编码组成的字符串。相当于
|string.byte|的逆运算。内部编码不一定可移植。      
string.char(104,101,108,108,111)
在mac上返回hello

string.dump (function)

返回一个字符串包含给定函数的二进制表述,以便于稍后使用|load|
函数加载该字串返回函数的副本。(可以重新指定|upvalues|)。

string.find (s,|pattern|[,init[,plain]])

查找字符串s中的第一个pattern匹配,如果发现匹配返回开始和结束
位置,否则返回nil。可选参数init指定查找开始位置默认为1,可以
为负数。第四个参数plain为true将关闭pattern匹配方式,函数简单
的搜索子串pattern。 >
string.find("data:2013/1/29.","%d+")
返回6,9

string.format (formatstring,…)

格式化输出变参,formatstring给出格式(必须是字符串)规则和C函
数sprintf一样。不同之处是*,h,L,l,n和p不被支持加入q。q可以是
string或者double数值。

string.gmatch (s,|pattern|)

返回一个iterator函数,每次调用它返回下个匹配。 
s = "hello world from Lua"
for w in string.gmatch(s,"%a+") do
    print(w)
end
另一个例子,收集key=value对。
t = {}
s = "from=world,to=Lua"
for k,v in string.gmatch(s,"(%w+)=(%w+)") do
    t[k] = v
end

string.gsub (s,|pattern|,repl[,n])

返回字符串s经过匹配替换的副本,如果发现模式就用repl替换。reple
可以是一个字符串,表格,或者函数。gsub返回第二个值是匹配的次数。
如果reple是一个字符串,将直接用于替换。%为转义字符,%d(d为1-9)
代表第n次俘获|captures|字串。%0代表整个匹配,%%代表字符%。
如果reple是一个表格,使用第一个俘获|captures|作为key查询该表格。
如果reple是一个函数,每次匹配成功将调用该函数。
如果表格查询和函数返回的是一个字符串或者数值,将被用于替换。如果
是false或者nil,将不替换。 
x = string.gsub("hello world","(%w+)","%1 %1")
--> x="hello hello world world"

x = string.gsub("hello world","%w+","%0 %0",1)
--> x="hello hello world"

x = string.gsub("hello world from Lua","(%w+)%s*(%w+)","%2 %1")
--> x="world hello Lua from"

x = string.gsub("home = $HOME,user = $USER","%$(%w+)",os.getenv)
--> x="home = /home/roberto,user = roberto"

x = string.gsub("4+5 = $return 4+5$","%$(.-)%$",
    function(s)
        return load(s)()
    end )
--> x="4+5 = 9"

local t = {name="lua",version="5.2"}
x = string.gsub("$name-$version.tar.gz","%$(%w+)",t)
--> x="lua-5.2.tar.gz"

string.len (s)

返回字符串的长度。空字符串""返回0。内部0也被计数。
如"a\000bc\000"返回5。

string.lower (s)

接收字符串返回该字符串小写复本。

string.match (s,|pattern|[,init])

查找s中的第一个匹配。如果发现一个,match返回pattern俘获。否则
返回nil。如果pattern不包括俘获|captures|,返回整个匹配。
可选参数init表示开始查找位置默认1,可以为负值。 >
x = string.match("hello world","%w+")
--> x="hello"

local x,y = string.match("hello world","(%w+)%s*(%w+)")
--> x="hello"
--> y="world"

string.rep (s,n[,sep])

返回一个字符串,由n个s组成,用sep分割。sep默认是空字符串
(没有分割)。 >
x = string.rep("hello",3," ")
--> x="hello hello hello"

string.reverse (s)

返回反转字符串。

string.sub (s,i[,j])

返回s从i到j的字串,i和j能为负数。默认j等于-1(最后一个字符位置)。
string.sub(s,1,j)相当于返回第一个到j的字符串。
string.sub(s,-i)返回长度为i的后缀。
如果i大于j函数返回空字符串。 >
x = string.sub("lua.5.2.tar.gz",-3)
--> x=".gz"
x = string.sub("hello lua hello",3,-3)
--> x="llo lua hel"

string.upper (s)

返回字符串的大写复本。
### Lua `lua.h` 头文件函数说明与文档 Lua 提供了丰富的 C API,允许开发者在 C/C++ 程序中嵌入和操作 Lua 脚本。`lua.h` 是 Lua 的核心头文件之一,定义了 Lua 虚拟机的基本类型和函数原型。通过该头文件可以访问 Lua 的栈、执行 Lua 代码、注册 C 函数、操作 Lua 变量等。 #### 核心函数说明 - `lua_State *luaL_newstate(void);` 创建一个新的 Lua 状态机,即一个独立的 Lua 虚拟机实例。每个状态机之间互不干扰,适用于多线程或多实例应用环境[^1]。 - `void luaL_openlibs(lua_State *L);` 加载 Lua 的标准库,包括 `base`、`coroutine`、`package`、`string`、`table`、`math`、`io`、`os` 和 `debug` 等模块。这是使用 Lua 脚本功能的基础步骤之一[^1]。 - `int luaL_loadfile(lua_State *L, const char *filename);` 将指定的 Lua 脚本文件加载到栈中,但不立即执行。如果加载失败,会将错误信息压入栈顶。通常与 `lua_pcall` 配合使用以执行脚本[^1]。 - `int lua_pcall(lua_State *L, int nargs, int nresults, int errfunc);` 用于调用 Lua 函数。`nargs` 表示传递给函数的参数个数,`nresults` 表示期望的返回值数量,`errfunc` 是错误处理函数的索引。若调用失败,会将错误信息压入栈顶[^1]。 - `void lua_getglobal(lua_State *L, const char *name);` 获取全局变量,将其压入栈顶。常用于访问 Lua 脚本中定义的表或函数。 - `void lua_pushstring(lua_State *L, const char *s);` 将一个字符串值压入栈顶,用于向 Lua 函数传递参数。 - `void lua_pushnumber(lua_State *L, lua_Number n);` 将一个数字值压入栈顶,常用于传递数值参数给 Lua 函数。 - `lua_Number lua_tonumber(lua_State *L, int index);` 将栈中指定索引位置的值换为数字类型。如果换失败,返回 0。用于获取 Lua 函数的返回值。 - `int lua_type(lua_State *L, int index);` 返回栈中指定索引位置的值的类型。可用于判断是否为表、函数字符串等类型。 - `void lua_close(lua_State *L);` 关闭 Lua 状态机,释放所有相关资源。在程序退出前必须调用该函数以避免内存泄漏。 #### 使用示例 以下是一个完整的 C 程序示例,展示如何加载并调用 Lua 脚本中的函数: ```c #include <stdio.h> #include <stdlib.h> #ifdef __cplusplus extern "C" { #endif #include <lauxlib.h> #include <lua.h> #include <lualib.h> #ifdef __cplusplus } #endif int main(void) { lua_State *L = luaL_newstate(); luaL_openlibs(L); if (luaL_loadfile(L, "init.lua")) { printf("load file: init.lua failed...\n"); lua_close(L); return 1; } lua_pcall(L, 0, 0, 0); lua_getglobal(L, "COM"); if (lua_type(L, -1) != LUA_TTABLE) { printf("can not find table: COM\n"); lua_close(L); return 1; } lua_pushstring(L, "myAdd"); lua_gettable(L, -2); if (lua_type(L, -1) != LUA_TFUNCTION) { printf("find myAdd is not a function.\n"); lua_close(L); return 1; } lua_pushnumber(L, 111); lua_pushnumber(L, 222); lua_pcall(L, 2, 1, 0); printf("call lua function add() and result: %d\n", (int)lua_tonumber(L, -1)); lua_close(L); return 0; } ``` 上述代码展示了如何从 Lua 脚本中调用一个名为 `myAdd` 的函数,并传递两个数值参数,最后获取返回结果。这种方式广泛用于游戏开发、插件系统等需要 Lua 与 C/C++ 交互的场景。 #### 文档资源 官方 Lua 文档是了解 `lua.h` 中函数最权威的来源,包括完整的 API 说明和使用建议。此外,Lua 的源码和注释也提供了详细的实现细节,适合深入理解 Lua 的内部机制。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值