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
參考:
Lua文法小貼士(一)字元串基礎操作
Lua文法小貼士(二)string庫
Lua文法小貼士(三)魔法字元