1.基础知识
1.1. 环境搭建
vs code+code runner +lua debug
https://blog.csdn.net/yanwennian/article/details/103480938
菜鸟教程
https://www.runoob.com/lua/lua-tutorial.html
Lua Tutorial
https://www.tutorialspoint.com/lua/index.htm
2. string相关
2.1. string基本
中括号表示多行string
[[
]]
2.2. string相关函数
2.2.1. string.match函数和string.gmatch函数区别
string.match(str, pattern, init)
解释:string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil
string.gmatch (s, pattern)
解释:返回一个迭代器函数,每一次调用这个函数,返回一个在字符串 s 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回 nil。
2.3. 匹配模式pattern
.(点): 与任何字符配对
%a: 与任何字母配对
%c: 与任何控制符配对(例如\n)
%d: 与任何数字配对
%l: 与任何小写字母配对
%p: 与任何标点(punctuation)配对
%s: 与空白字符配对
%u: 与任何大写字母配对
%w: 与任何字母/数字配对
%x: 与任何十六进制数配对
%z: 与任何代表0的字符配对
%x(此处x是非字母非数字字符): 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*±?)的配对问题, 例如%%与%配对
[数个字符类]: 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对
当上述的字符类用大写书写时, 表示与非此字符类的任何字符配对. 例如, %S表示与任何非空白字符配对.例如,’%A’非字母的字符
‘%’ 用作特殊字符的转义字符,因此 ‘%.’ 匹配点;’%%’ 匹配字符 ‘%’。转义字符 ‘%’不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。
模式条目可以是:
- 匹配前一字符1次或多次
- 匹配前一字符0次或多次
- 匹配前一字符0次或多次
? 匹配前一字符0次或1次
模式:
模式 指一个模式条目的序列。 在模式最前面加上符号 ‘^’ 将锚定从字符串的开始处做匹配。 在模式最后面加上符号 ‘KaTeX parse error: Expected group after '^' at position 24: …锚定到字符串的结尾。 如果 '^̲' 和 '’ 出现在其它位置,它们均没有特殊含义,只表示自身。
捕获:
模式可以在内部用小括号括起一个子模式; 这些子模式被称为 捕获物。 当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。 捕获物以它们左括号的次序来编号。 例如,对于模式 “(a*(.)%w(%s*))” , 字符串中匹配到 “a*(.)%w(%s*)” 的部分保存在第一个捕获物中 (因此是编号 1 ); 由 “.” 匹配到的字符是 2 号捕获物, 匹配到 “%s*” 的那部分是 3 号。
作为一个特例,空的捕获 () 将捕获到当前字符串的位置(它是一个数字)。 例如,如果将模式 “()aa()” 作用到字符串 “flaaap” 上,将产生两个捕获物: 3 和 5 。
3. io相关
3.1. IO 常见问题
3.1.1. open 函数 使用相对路径时 要注意起点为当前项目根目录
比如
当前在shaowei.zhao项目
io_test.lua在shaowei.zhao/src目录
io_conf.txt在shaowei.zhao/src目录
则open的文件路径用相对路径 要注意是在shaowei.zhao为起点。
打开io_conf 需要用 ./src/io_conf.txt 或者src/io_conf.txt为文件路径
4. table
table可以是数组array,字典map
4.1 插入
table.insert (table, [pos,] value):
4.2 删除
table.remove (table [, pos])
4.3 排序
按字母a-z,数字0-9排序
table.sort (table [, comp])
4.4 map的初始化
local map = { id = 1,name = 2}
print(map[“id”])
for k, v in pairs(map) do
print(k…"="…v)
end
5. 迭代器
6. Metatable
7. json
使用CJson参考:https://www.jianshu.com/p/c5f3d4ec1497
基本就是找个动态库 cjson.dll 放到lua/clibs下面即可 使用cjson
local jsonData = [[ { "test": 1, "data": false, "sample": "sample" } ]] --这个是string类型 可以使用type(jsonData)判断
8. sqlite
luasql.sqlite3教程:https://www.tutorialspoint.com/lua/lua_database_access.htm
菜鸟教程 sql教程:https://www.runoob.com/sql/sql-delete.html
9. pcre正则
pcre 正则表达式 不是lua的string模式匹配表达式
正则表达式教程:http://mushclient.com/pcre/pcrepattern.html
10. 常见问题
10.1. #号
10.1.1. 一元运算符 返回一个字符串或者一个表的长度
print(“len:”,#fruits)
print(“strlen”,#“helloworld”)
10.1.2. 判断不定参数数量:select("#",…)
10.2. …和,区别
… :连接两个字符串。
例如:print(“Hello”…“World”)==>HelloWorld
, :
10.3. 模块与C包 引入问题
10.3.1. require函数 载入模块
在加载一个.lua文件时,require会先在package.loaded中查找此模块是否存在,如果存在,直接返回模块。
如果不存在,则加载模块文件。
注意:
模块库需要单独放在其他目录中,跟源码src中 require载入时 会提示报错 找不到
如果非要和源码放在一起,另一种解决办法是相对路径先出这个文件夹再进入文件夹
例如:
lua_lib 在 src目录下
require("…/src/lua_lib")
10.3.2. loadfile函数
dofile:读入代码文件并编译执行。每调用dofile一次,都会重新编译执行一次。
loadfile:编译代码,将整个模块文件当成一个函数返回,但是不执行代码。
10.3.3. loadlib函数 载入C包
loadlib 函数加载指定的动态链接库并且连接到 Lua,然而它并不打开库(也就是说没有调用初始化函数),反之他返回初始化函数作为 Lua 的一个函数
10.3.4. load函数
https://www.junmajinlong.com/lua/dofile_loadfile_load/
load()从给定字符串中读取代码或从一个函数中读取代码,然后以函数的方式返回。如果chunk是一个函数,load()将不断调用该函数来获取代码片段,直到该函数遇到nil。