欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

lua正则表达式

程序员文章站 2022-06-04 15:51:50
...

在Lua中使用正则表达式进行模式匹配的string库函数有这四个:

string.find(str, pattern[, init[, plain]])

string.gsub(str, pattern, repl[, n])

string.match(str, pattern[, init])

string.gmatch(str, pattern)

在Lua中进行模式匹配的时候支持的字符类如下:

lua正则表达式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次

相关标签: lua