Lua 正则表达式
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)()
正则表达式
预定义字符集 | |
---|---|
%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>