Lua模式匹配
模式匹配相关函数
在string标准库中,使用了pattern进行匹配操作有4个相关函数,find()、match()、gsub()、gmatch()。
1. string.find()
string.find(str, pattern, option:index, option:isSimple)
- str: 目标字符串
- pattern: 匹配字符串
- index: 从目标字符串中的哪个位置开始搜索
- isSimple: 是否进行简单搜索,忽略pattern等正则表达
string.find 用于在指定的目标字符串中搜索指定模式,方法return 2个返回值。如果存在值会返回开始位置索引和结束位置索引,没有匹配返回nil。
s = "hello world"
i, j = string.find(s, "hello") --> 1, 5
string.sub(s, i, j) --> hello
i, j = string.find(s, "l") --> 33
string.find(s, "lll") --> nil
2. string.match()
string.match(str, pattern)
- s :目标字符串
- patten :匹配字符串
find返回index, match返回字符串
date = "Today is 17/7/1990"
d = string.match(date, "%d+/%d+/%d+") --> 17/7/1990
3. String.gsub
string.gsub(str, pattern, replaceStr, option: count)
- str: 目标字符串
- pattern:匹配字符串
- replaceStr: 替换字符串
- count: 替换次数
返回被替换之后的目标字符串 和 替换次数
string.gsub("Lua is cute", "cute", "great") --> Lua is great
string.gsub("all lii", "l", "x") --> axx xii
string.gusb
string.gmatch
返回迭代器return所有的相匹配的字符串 string.gmatch(str, pattern, option:init)
- str: 目标字符串
- pattern: 匹配字符串
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w)
end
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
t[k] = v
end
模式(pattern)
Lua语言中模式使用百分号%作为转义,和C语言中的用法相同,所有被转义的字母都有特殊含义。所有非转义的字符代表本身"%"" 匹配一个双引号。
s = "Deadline is 30/05/1999, firm"
data = "%d%d/%d%d/%d%d%d%d"
string.match(s, date) --> 30/05/1999
在模式匹配中,().%+-*?[]11$, 这些字符包含特殊含义
也可以使用字符集来定义字符分类,例如'[%w_]' 匹配所有以下划线结尾的字母和数字,'[01]'匹配二进制数字, '[%[]]'匹配方括号, '[0-9]'表示所有数字。在字符前加修饰符号可以表示重复等含义。
捕获
简单来说就是使用括号将要匹配的字符合集返回出去, 每一个捕获都可以将所匹配到的值返回出去
date = "Deadline is 30/05/1999, firm"
d, m, y = string.match(date, "(%d+)/(%d+)/(%d+)") --> 30 05 1999