天天看點

Lua文法小貼士(三)魔法字元

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文法小貼士(三)魔法字元