[笔记]Lua脚本学习笔记《一》

275 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

@[toc]

1.基础知识

1.1. 环境搭建

vs code+code runner +lua debug

blog.csdn.net/yanwennian/…

菜鸟教程

www.runoob.com/lua/lua-tut…

Lua Tutorial

www.tutorialspoint.com/lua/index.h…

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次

模式: 模式 指一个模式条目的序列。 在模式最前面加上符号 '^' 将锚定从字符串的开始处做匹配。 在模式最后面加上符号 '' 将使匹配过程锚定到字符串的结尾。 如果 '^' 和 '' 出现在其它位置,它们均没有特殊含义,只表示自身。 捕获: 模式可以在内部用小括号括起一个子模式; 这些子模式被称为 捕获物。 当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。 捕获物以它们左括号的次序来编号。 例如,对于模式 "(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参考:www.jianshu.com/p/c5f3d4ec1…

基本就是找个动态库 cjson.dll 放到lua/clibs下面即可 使用cjson

local jsonData = [[ 
            { 
              "test": 1,
            "data": false,
            "sample": "sample"

           }
]] --这个是string类型 可以使用type(jsonData)判断

8. sqlite

luasql.sqlite3教程:www.tutorialspoint.com/lua/lua_dat…

菜鸟教程 sql教程:www.runoob.com/sql/sql-del…

9. pcre正则

pcre 正则表达式 不是lua的string模式匹配表达式

正则表达式教程:mushclient.com/pcre/pcrepa…

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函数

www.junmajinlong.com/lua/dofile_…

load()从给定字符串中读取代码或从一个函数中读取代码,然后以函数的方式返回。如果chunk是一个函数,load()将不断调用该函数来获取代码片段,直到该函数遇到nil。