LUA正则表达式 - 模式匹配


模式匹配相关库函数

按匹配查找:string.find (s,pattern [,init [,plain]])

两个返回值,被捕获内容的起始位置和终止位置,如未找到则返回nil。

参数s:指定字符串,参数pattern:匹配,可选参数init:初始查找位置(如果是负数将从字符串尾开始定位),可选参数plain:无参数时按模式匹配查找,当参数为true时使用单纯字符串进行匹配。

 

按位置捕获:string.sub (s,i [,j])

返回以i,j定位的子串内容。

参数s:指定字符串,参数i:初始查找位置(如果是负数将从字符串尾开始定位),可选参数j:无参数时默认匹配相对i的整段字符串,如果j比整个字符串大则自动修正,如果j比i小则返回空字符串。

 

按匹配捕获:string.match (s,pattern [,init])

返回按匹配捕获的子串,如未捕获则返回nil。如果在参数pattern中需要对内容进行捕获()则返回值变为依次捕获到内容。

参数s:指定字符串,参数pattern:匹配,可选参数init:初始查找位置(如果是负数将从字符串尾开始定位)

 

按匹配捕获并替换:string.gsub (s,pattern,replace [,n])

两个返回值,成功替换后的新字符串和被替换的次数,如未找到匹配则返回s原始内容。

参数s:指定字符串,参数pattern:匹配,参数replace:替换内容(可以是表或函数),可选参数n:替换次数,无参数则全部替换。

 

迭代器函数:string.gmatch (s,pattern)

每次迭代返回一个匹配的子串内容,该函数用于逐一遍历字符串中所有捕获到的匹配。

参数s:指定字符串,参数pattern:匹配

模式匹配预置的字符分类

 .  -- 任意字符
%a  -- 字母
%c  -- 控制符,如\n
%d  -- 数字
%g  -- 除空格外的可打印字符
%l  -- 小写字母
%p  -- 标点符号
%s  -- 空白字符
%u  -- 大写字母
%w  -- 字母和数字
%x  -- 十六进制数字
%n  -- 第n次被()捕获的内容,n是一个数字,如:%1 %2 %3,而%0则意味着整个匹配而不是捕获
%f  -- 前置排除模式
%b  -- 范围匹配,使用两个字符参数确定前后成对的区域,如:%b<> %b{} %b33 %b-+ 遵循最远距离贪婪匹配规则

魔法字符(修饰符)

 %  -- 转义符
 +  -- 重复一次或多次
 *  -- 重复零次或多次(最远距离贪婪匹配)
 -  -- 重复零次或多次(最近距离匹配)
 ?  -- 重复零次或一次(表示可有可无)
 ^  -- 锚定开头
 $  -- 锚定结尾
[]  -- 自定义字符分类,分类间的关系是"或"
()  -- 捕获,空的捕获可以返回位置信息,如:字符串"Name",模式"()am()"返回2,4。
   使用修饰符时一定要注意上下文,如:.*很可能匹配超预期
   在结尾使用"-"并没有意义,这样只能匹配到空字符,-后面总是要跟上一些东西来限制扩展范围

当模式匹配字母大写时表示其补集,非字母代表其本身,在模式中%需要转义,如%%。而匹配无意义的修饰符时也需要加转义字符%。

Lua正则在线测试工具 (luatos.com)

LuatOS 在线模拟 - lua在线测试