Browsed by
Category: LuaSource

[Lua 源码解读 0] lstrlib.c 模式匹配系列函数解析

[Lua 源码解读 0] lstrlib.c 模式匹配系列函数解析

前言 当当当当~~~~ lua源码阅读的记录文开坑了, 窝准备把lua的源码都通读一遍,并且给出自己的记录&体会,最后,根据阅读源码学到的东西,考虑实现一个相关的小project(这是一个大坑,flag已立) 提供一些我找到的对阅读源码有帮助的资源 http://del.icio.us/adnamin/lua+source 窝按照这里提供的顺序阅读lua源码, 至少起步是按照这个顺序来的,等到自己对这个代码比较熟练的时候,可能会考虑按照自己的喜好顺序来 https://www.reddit.com/comments/63hth/ask_reddit_which_oss_codebases_out_there_are_so/c02pxbp lmathlib.c中的很多函数都只是一个wrapper的作用,在这里就先不过多介绍了,我们先来介绍lstrlib.c的函数&功能 lstrlib.c提供了lua的字符串相关的库函数&helper函数,一个重点功能是提供了pattern matching的功能,注意它提供的pattern和正则表达式是有区别的,应该说功能没有正则表达式强大,但是日常匹配使用也是够了,lua官方对这个pattern有一个很系统的解释,这里总结一下,并且理解这个对阅读相关的代码也有很大的帮助,先放一个Lua5.1原生文档对Pattern的说明的链接 https://www.lua.org/manual/5.1/manual.html#5.4.1 下面就来解释一下Lua里面的模式匹配及其定义的体系 Lua 的 Pattern 体系 character class 是组成一个pattern串的基本单位, 每一个character class代表一类字符,他们可以是一个set里的,可以是set的补集,可以是转义字符定义的类型如%d数字%l小写字母等 pattern item是用来匹配的基本单位,一个pattern item由一个character class加上*,+,…等特定的符号组成,表示重复多次、一次等含义,几个特殊的pattern,一个是 %n, n可以是0-9的数字, 表示匹配的内容和capture的内容一致,%bxy表示balance match从x开始到y的一个字符串, 关于什么是balance match详见文档 pattern是匹配的基本单位,一个pattern由一个或者多个pattern item组成,可以在首部含有^尾部含有$,语意和正则表达式内的这两个符号的语意一致 capture 是将一个pattern用小括号括起来, 然后如果源子串match了这个括号内的pattern,会被“捕捉”(存储)起来供之后的匹配使用   源码解析 首先我们来看一下 最下方export的函数,这里export了一系列的函数如下 static const luaL_Reg strlib[] = { {“byte”, str_byte}, {“char”, str_char}, {“dump”, str_dump}, {“find”, str_find}, {“format”, str_format}, {“gfind”, gfind_nodef}, {“gmatch”, gmatch}, {“gsub”, str_gsub}, {“len”, str_len}, {“lower”, str_lower}, {“match”, str_match}, {“rep”, str_rep}, {“reverse”, str_reverse}, {“sub”, str_sub}, {“upper”, str_upper}, {NULL, NULL}…

Read More Read More