1、模式匹配函数
1.1、string.find
在目标字符串中搜索模式,返回两个值,匹配位置的开始和结束位置。如果没有匹配,返回nil
当匹配时,使用string.sub带上string.find返回的参数返回 的是匹配的字符串。
string.find有另外两个可选参数,第三个表示搜索的开始位置,第四个表示是否是纯文本搜索。
print(string.find("a [word]", "["))
会报错
print(string.find("a [word]", "[", 1, true))
输出
1.2 string.match
与string.find相似,返回值不同,返回 的是匹配的子串。
匹配日期模式
print(string.match("Today is 17/7/1990", "%d+/%d+/%d+"))
1.3 string.gsub
全局替换,返回的第二个参数表示完成替换的次数
s = string.gsub("Lua is cute", "cute", "greate")
print(s)
s = string.gsub("all lii", "l", "x")
print(s)
s = string.gsub("Lua is great", "Sol", "Sun")
print(s)
输出:
1.4 string.gmatch
返回一个迭代所有模式出现的函数。
s = "some string"
words = {}
for w in string.gmatch(s, "%a+") do
print(w)
words[#words + 1] = w
end
输出:
2、模式
lua使用%作为转义字符
支持的字符类有
. | 表示所有字符 |
%a | 表示字母 |
%c | 表示控制符 |
%d | 表示数字 |
%g | 表示除去空格的可打印字符 |
%l | 表示小写字母 |
%p | 表示标点符号字符 |
%s | 表示空格字符 |
%u | 表示大写字母 |
%w | 表示字母+数字 |
%x | 表示十六进制字符 |
上述的大写表示表示对应字符集的补集
2.1 魔法字符
包含( ) . % + - * ? [ ] ^ $
自定义字符集使用[]方括号。在方括号中也可以定义范围,在第一个字符与最后一个字符之间添加中划线。
自定义字符补集使用[^]形式。
2.2 重复次数和可选项
其修饰符包含
+ | 1次或者更多次 |
* | 0次或者更多次,最长匹配 |
- | 0次或者更多次(懒形式),最短匹配 |
? | 可选(0或者1) |
test = "int x; /* x */ int y; /* y */"
print((string.gsub(test, "/%*.*%*/", "")))
输出为
test = "int x; /* x */ int y; /* y */"
print((string.gsub(test, "/%*.-%*/", "")))
输出为
2.3 其它元字符
^ | 开始匹配 |
$ | 结尾匹配 |
%b | 匹配平衡字符串。%bxy, x表示开始字符,y表示结束字符 |
%f[char-set] | 当下一字符在字符集内,而前一个字符不在时用于匹配空字符串 |
s = "a (enclosed (in) parentheses) line"
print((string.gsub(s, "%b()", "")))
输出为:
a line
s = "the anthem is the theme"
print((string.gsub(s, "%f[%w]the%f[%W]", "one")))
输出为:
one anthem is one theme
3、捕获
在括号内写模式的部分来实现捕获。当模式有捕获时,string.match返回捕获的值。
()用于捕获位置,返回 的是数字
print(string.match("hello", "()ll()")) 输出: 3 5
pair = "name = Anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value)
输出:
name Anna
date = "Today is 17/7/1990"
d, m, y = string.match(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y)
输出:
17 7 1990
3.1 捕获引用
使用%n,其中n表示第n个捕获
s = [[then he said: "it's all right"!]]
q, quotedPart = string.match(s, "([\"'])(.-)%1")
print(q, quotedPart)
输出:
" it's all right
p = "%[(=*)%[(.-)%]%1%]"
s = "a = [=[[[ something ]] ]==] ]=]; print(a)"
print(string.match(s, p))
输出:
= [[ something ]] ]==]
string.gsub替换中使用捕获。%0表示整个匹配。
print((string.gsub("hello, Lua!", "%a", "%0-%0")))
输出:
h-he-el-ll-lo-o, L-Lu-ua-a!