在Lua中使用正則表達式進行模式匹配的string庫函數有這四個:
string.find(str, pattern[, init[, plain]])
string.gsub(str, pattern, repl[, n])
string.match(str, pattern[, init])
string.gmatch(str, pattern)
在Lua中進行模式匹配的時候支持的字符類如下:
特殊元字符的例子:
-- .
local str = "a1&"
print(string.gsub(str, ".", "x")) -- xxx 3
-- %
str = "%ab*%%"
print(string.gsub(str, "%%", "x")) -- xab*xx 3
print(string.gsub(str, "%*", "y")) -- %aby%% 1
-- ()
str = "<body>主幹</body>"
print(string.match(str, "<body>.+</body>")) -- <body>主幹</body>
print(string.match(str, "<body>(.+)</body>")) -- 主幹
-- []
str = "ab3cc8dmf,xx"
print(string.gsub(str, "[a5-8m-n,]", "z")) -- zb3cczdzfzxx 4
print(string.gsub(str, "[^a5-8m-n,]", "z")) -- azzzz8zmz,zz 8
--[[
說明:
"[^...]"會匹配不在...中的集合,即...的補集,例如"[^%d]"爲匹配非數字字符,和"[%D]"效果一樣
而"^..."匹配的是以...開頭,例如"^%d+"爲以數字開頭的匹配
]]
-- ^
print(string.match("1abc", "^%d")) -- 1
print(string.match("a1bc", "^%d")) -- nil
-- $
print(string.match("abc1", "%d$")) -- 1
print(string.match("ab1c", "%d$")) -- nil
-- +
str = "ab12345ed"
print(string.match(str, "%d+")) -- 12345
-- * -
str = "<a><b><c>"
print(string.gsub(str, "<.*>", "{ok}")) -- {ok} 1
print(string.gsub(str, "<.->", "{ok}")) -- {ok}{ok}{ok} 3
--[[
說明:
*和-比較類似,只是*進行最長匹配,而-是進行最短匹配
所以在例子中使用*進行匹配的時候,會匹配第一個"<"到最後一個">"之間的所有內容進行替換,只匹配到了一次
而使用-進行匹配的時候,則會第一個"<"到第一個">"之間的內容進行替換,一共匹配到了3次
]]
-- ?
print(string.match("abc100", "[+-]?%d+")) -- 100
print(string.match("abc-100", "[+-]?%d+")) -- -100
print(string.match("abc+100", "[+-]?%d+")) -- +100
--[[
說明:
?是匹配前一字符0次或1次
在例子中即匹配字符類"[+-]"0次或1次,將這個匹配模式稍微改動一下,改成"^[+-]?%d+$"就可以檢查這個字符串是否是整數了
]]
簡單應用:
-- 判斷字符串是否爲純數字字符串
function judgeNumString(str)
return string.match(str, "%d+") == str
end
local str1 = "3497439"
local str2 = "83048a389b"
print(judgeNumString(str1), judgeNumString(str2)) -- true false
-- 判斷是否是手機號碼(大陸)
function judgePhoneNum(str)
return string.match(str,"[1][3-9]%d%d%d%d%d%d%d%d%d") == str
end
str1 = "13347823759"
str2 = "10348932849"
print(judgePhoneNum(str1), judgePhoneNum(str2)) -- true false
只所以想到這塊,是因爲之前寫richLabel的時候卡到了:
*和-比較類似,只是*進行最長匹配,而-是進行最短匹配
所以在例子中使用*進行匹配的時候,會匹配第一個"<"到最後一個">"之間的所有內容進行替換,只匹配到了一次
而使用-進行匹配的時候,則會第一個"<"到第一個">"之間的內容進行替換,一共匹配到了3次