Lua里的魔法字符包括:
. % + * - ? [ ] ^ ( ) $
可以使用它们对字符串进行模式匹配。
模式符号:
. 所有字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点符号
%s 空白字符
%u 大写字母
%w 字母或数字
%x 十六进制字符
%z 内部表示为0的字母
大写形式表示它们的补集,例如%A表示非字母
local s = "Today is 11/10/2016"
print(string.match(s,"%d")) --1
print(string.match(s,"%D")) --T
修饰符号:
+ 重复1次或多次
* 重复0次或多次
- 重复0此或多次
? 可选部分(重复0次或1次)
示例:
local s = "Today is 11/10/2016"
local p = "%d+/%d+/%d+"
print(string.match(s,p)) --11/10/2016
其它符号:
使用[]可以创建字符集,例如:
print(string.match("9 is a number", "[0123456789]")) --9
并且可以使用-符号来简化它:
print(string.match("9 is a number", "[0-9]")) --9
类似的用法还有:
print(string.match("9 is a number", "[a-nA-N]")) --i
而加上 ^ 表示这个字符集的补集:
print(string.match("9 is a number", "[^a-nA-N0-9 ]")) --s
使用 () 可以将匹配的值单独捕获:
local date = "Today is 10/10/2016"
local p = "(%d+)/(%d+)/(%d+)"
local d,m,y = string.match(date,p)
print(d) --10
print(m) --10
print(y) --2016
%加数字表示捕获序号:
local s = "abcdefg"
print(string.gsub(s,"(%w)(%w)(%w)","%3%2%1")) --cbafedg
例如,将日期格式dd/mm/yyyy转换成yyyy-mm-dd
local s = "Tommorow is 11/10/2016"
print(string.gsub(s,"(%d+)/(%d+)/(%d+)", "%3-%2-%1")) --Tommorow is 2016-10-11
%加特殊符号 表示该符号的字符:
local s = "[Date]2016-10-10"
local p = "[%[%]%-]"
for w in string.gmatch(s,p) do
print(w)
end
$ 符号表示变量,例如:
name = "Lua"
status = "good"
print(string.gsub("$name is $status", "$(%w+)", _G)) --Lua is good
再例如:
local tbl = {}
tbl.name = "Lua"
tbl.status = "good"
print(string.gsub("$name is $status", "$(%w+)", tbl)) --Lua is good
|