Lua 正则表达式

2.5k 词

Lua字符串匹配

与正则相关的函数

str = "{1:[1,2,3],2:{idx2:2,level:60,reward_idx:2001,ring:100},test:{1:100,2:200}}"

string.find(s, pattern[, init[, plaub]])

在字符串 s 中匹配 pattern,如果匹配成功,则返回第一个匹配到的子串的起始索引和结束索引,如果 pattern 中有分组,那么分组匹配的内容也会接在两个索引值后面返回;如果匹配失败则返回 nil。 第三个可选参数 init 指明从哪里开始搜索,默认值为1,可以是负值。 第四个可选参数 plain 为true 时,关闭模式匹配机制,pattern 作为普通字符串进行匹配。

string.find(str, '1,2,3')
5 9
string.find(str, '%a+')
15 17
string.find(str, '(%d+),(%d+),(%d+)')
5 9 "1" "2" "3"
string.find(str, '%d', 1, true)
nil

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

在字符串 s 中匹配 pattern,如果匹配成功,若 pattern 没有分组,则返回第一个匹配到的子串,若有分组,则依次返回各个匹配的分组;匹配失败则返回 nil。 第三个可选参数 init 指明从哪里开始搜索,默认值为1,可以是负值。

string.match(str, '%d+,%d+,%d+')
"1,2,3"
string.match(str, '(%d+)(:)([[]%d+)')
"1" ":" "[1"
string.match(str, '((%d+)(:)([[]%d+))')
"1:[1" "1" ":" "[1"

string.gmatch(s, pattern)

返回一个迭代器函数,每次调用迭代器,会返回下一个匹配到的子串,如果 pattern 中有分组,则返回的是子串对应的分组。 对这个函数来说,匹配模板前开始的 '^' 不会当成锚点,这样会阻止迭代。

for s, a in string.gmatch('Hanazawa Kana', '(a(%a)a)') do print(s, a) end
"ana" "n"
"awa" "w"
"ana" "n"
注意:'ana' 匹配成功后,接下来的匹配从 'z' 开始,导致 'z' 没有被正确匹配到。

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

将字符串 s 中所有(或者可选参数前 n 个)pattern 替换成 repl,返回替换后的字符串和替换的次数。 如果 repl 是一个字符串,则把这个字符串作为替换品。字符 % 是一个转义符:repl 中所有形式为 %d 的串表示第 d 个捕获到的子串,d 可以是1到9,%0 表示整个匹配,%% 表示单个 %。 如果 repl 是表,每次匹配时会用第一个捕获作为建去查找表。 如果 repl 是函数,则每次匹配时会调用函数,所有捕获到的子串依次作为参数传入。

将 json 字符串转成 lua 字符串

str = string.gusb(str, "[[]", "{")
str = string.gsub(str, "]", "}")
str = string.gusb(str, "([{,])(%d+):", "%1[%2]=")
str = string.gsub(str, "([{,])([%w_]+):", "%1%2=")
print(str)
"{[1]={1,2,3},[2]={idx2=2,level=60,reward_idx=2001,ring=100},test={[1]=100,[2]=200}"
load("return " .. str)()

正则表达式

字符 描述
普通字符 除去%.^$*+-?的字符,匹配字符本身
. 匹配任意字符
% 转义字符,当后面的字符是特殊字符时,还原特殊字符的愿意。% 和一些特定字母组合构成 lua 的预定义字符集。% 和数字 1~9 组合表示之前捕获的分组
[…] 字符集,匹配一个包含于集合内的串,[…] 中的特殊字符表示原意
[…-…] - 表示 ASCII 码在它前一个字符到它后一个字符之间的所有字符
[^…] 不在 … 中的字符集合
预定义字符集  
%s 空白符[rntvf]
%p 标点符号
%c 控制符号
%w 字母数字 [a-zA-Z0-9]
%a 字母 [a-zA-Z]
%l 小写字母 [a-z]
%u 大写字母 [A-Z]
%d 数字 [0-9]
%x 16进制数 [0-9a-fA-F]
%z ASCII 码是 0 的字符
重复(数量词)  
* 表示前一个字符出现 0 到多次
+ 表示前一个字符出现 1 到多次
? 表示前一个字符出现 0 或 1 次
- 表示前一个字符出现 0 到多次,与 * 不同的是会匹配尽可能短的串
分组/捕获  
(…) 表达式中用 () 包围的字符串作为一个分组,分组从左到右,组序号从 1 开始递增,空的捕获 () 将捕获到当前字符串的位置(是一个数字)。
边界匹配(属于零宽断言)  
^ 在模式最前面加 ^ 匹配字符串开头,出现在其它位置没有特殊含义
$ 在模式最后面加 $ 匹配字符串结尾,出现在其它位置没有特殊含义
%b  
%bxy 匹配 xy 对,x,y 是两个表示原本意义的字符,匹配到的串以 x 开始 y 结束,且其中 x 和 y 保持平衡。即这个字符从左到右开始计数,遇 x 就 +1,遇 y 就 -1,到最终结束的 y 处是第一个计数到 0 的 y。%b() 可以匹配到括号平衡的表达式。
%f[…] 边界模式。会匹配到一个处于 … 内某个字符之前的一个空串,且这个位置的前一个字符不属于 …。

参考链接

                </div>