2023-12-07    2023-12-07    797 字  2 分钟

常用函数

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

  • 参数:
    • s: 将要匹配字符串
    • pattern: 匹配字符
    • init: 可选参数, 从那个引索开始匹配,默认从头(引索为 1)开始匹配
    • plain: 可选参数, 为 true 时,普通字符串匹配,默认正则匹配
  • 返回: 匹配成功的开始,结束引索
1
2
3
4
string.find("emacs", "ma") -- ==> 3 4
string.find("emacs", "m%w+s") -- ==> 2   5
string.find("emacs", "m(%w+)s") -- ==> 2 5 ac
string.find("emacs", "m(%w+)s", nil, true) -- ==> nil

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

  • 参数:
    • s: 将要匹配字符串
    • pattern: 匹配字符
    • init: 可选参数, 从那个引索开始匹配,默认从头(引索为 1)开始匹配
  • 返回: 匹配失败,返回 nil, 当 pattern 没有分组,返回第一个匹配的子串,返回第一个匹配到子串的分组,多个分组就返回多个。可选参数 init 表示匹配字符串的起始索引,缺省为 1,可以为负索引。
1
2
3
string.match("2015-5-12 13:53", "%d+-%d+-%d+") -- => "2015-5-12"
string.match("2015-5-12 13:53", "(%d+)-(%d+)-(%d+)") -- => 2015 5 12
string.match("2015-5-12 13:53", "((%d+)-(%d+)-(%d+))") -- => "2015-5-12" 2015 5 12

string.gmatch(s, pattern)

  • 参数:
    • s: 将要匹配字符串
    • pattern: 匹配字符
  • 返回: 返回一个迭代器。每当迭代器调用时,返回下一个匹配到的子串,如果 pattern 中有分组,返回的是子串对应的分组。gmatch 也可以用 find 和循环来实现。
1
2
3
4
5
6
for s in string.gmatch('2015-5-12 22:20', '%d+') do print(s) end
-- 2015
-- 5
-- 12
-- 22
-- 20

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

  • 参数:
    • s: 将要匹配字符串
    • pattern: 匹配字符
    • repl: 将匹配到的 pattern 替换为 repl, repl 可以是一个函数,或一个 string
    • n: 替换次数,默认全部替换
  • 返回替换后的字符串
1
2
string.gsub('Hanazawa Kana', 'na', 'nya') -- => 'Hanazawa Kanya'
string.gsub('Hanazawa Kana', 'na', function(s) return string.sub(s,1,1) .. 'yy' .. string.sub(s,2,2) end) -- => 'Haanyyazawa Kanya'

lua 常用正则表达式表

元字符描述表达式完整匹配字符串
字符
普通字符串匹配除去%.[]^$*+-?的字符kanakana
.匹配任意字符k.akva
%转义字符%%%
[…]字符集合[a%]aaa
[..-..]- 表示 ascii 码前后所有字符[a-z]ana
[^…]^ 不在集合中的字符[^az]c
重复
*前一个字符的 0 次或多次a*aaaa
+前一个字符的 1 次或 1 次以上[a-z]+axc
?字符出现 0 次或 1 次[a-z]?1a1
预订字符集
%s空白字符[\r\n\t\v\f]an[%s]?9an 9
%p标点符号an[%p]?9an.9
%c控制字符
%w类似[a-zA-Z0-9]%w+a1Z
%a字母[a-zA-Z]%a+aZ
%l小写字符[a-z]%l+ac
%u大写字符[A-Z]%u+ACB
%d数字[0-9]%d+123
%x16 进制数字[0-9a-fA-F]%x+fe12
%zascii 码为 0 的字符
分组
(…)分组a(cd)ad
边界匹配
^字符串开头
$字符串结尾
%b平衡匹配(匹配 xy 对)%b()(3+4(x*2))