文章目录
10.1
#!/usr/bin/env lua
function split(s,d)
local word={}
d=("[".."^"..d.."]".."+")
for w in string.gmatch(s,d) do
word[#word+1]=w
end
return word
end
t=split("a whole new world"," ")
for i,j in pairs(t) do
print(i,j)
end
10.2
不相同,[^%d%u]表示的是非%d且非%u,即不是数字且不是大写字母。而[%D%U]表示非%d或非%u,即不是数字或不是大写字母。
10.3
#!/usr/bin/lua
function transliterate(s,t)
for key,alpha in pairs(t) do
local sp=string.gsub(key,"(%W)","%%%1")
if t[key]==false then
s=string.gsub(s,sp,"")
else
s=string.gsub(s,sp,alpha)
end
end
return s
end
str="hello world![[[--]]]"
tab={e="1",l="2",["["]="x"}
str=transliterate(str,tab)
print(str)
10.4
如果在非空白字符中间夹杂大量的空白字符的话,就是造成它一直向后匹配,时间复杂度 O ( n 2 ) O(n^2) O(n2),但是我们要是直接匹配开头和结尾为非空白符的子串的话时间复杂度就是 O ( n ) O(n) O(n)。1
#!/usr/bin/lua
function oldtrim(s)
s=string.gsub(s,"%s*(.-)%s*","%1")
return s
end
str=string.rep(" ",100000000)
str=(" ".."a"..str.."a".." ")
time=os.clock()
oldtrim(str)
print(os.clock()-time)
function newtrim(s)
s=string.match(s,"%S.*%S*")
return s
end
time=os.clock()
newtrim(str)
print(os.clock()-time)
10.5
#!/usr/bin/lua
--把字符串常量转换为十六进制表示,每十个字符一行
function escape(s)
local count=1
s=string.gsub(s,".",function (n)
if count<10 then
count=count+1
return string.format("\\x%02X",string.byte(n))
else
count=1
return string.format("\\x%02X\n",string.byte(n))
end
end)
return s
end
--把十六进制转换成字符串常量
function unescape(s)
s=string.gsub(s,"\n","")
s=string.gsub(s,"\\x(%x%x)",function (n)
return string.char(tonumber(n,16))
end)
return s
end
s="\0\1hello\nworld\nwakakakakakakakak"
s=escape(s)
print(s)
s=unescape(s)
print(s)
10.6
待完善
10.7
待完善
lua模式匹配2
相关函数
string.find()
在目标字符串中搜索指定的模式,找到模式后返回模式开始位置索引和结束位置的索引,没有匹配则返回 nil;还有两个可选参数,第三个为开始索引的位置,第四个为是否进行简单搜索3。
string.match()
返回目标字符串中与模式相匹配的子串
string.gmatch()
会返回一个函数,通过该函数可以遍历字符串中所有出现的指定模式
string.gsub()
三个必选参数:目标字符串、模式、替换字符串,将目标字符串中所有出现模式的地方替换成替换字符串。第四个可选参数,用于限制替换次数。
替换字符串可以用一个函数或者表代替,函数或表会被调用以产生替换字符串。
返回替换完的字符串和发生替换的次数。
限定字符
锚字符 | 含义 |
---|---|
^ | 定义从数据流中文本行的行首开始的模式 |
$ | 定义了行尾 |
限定符 | 含义 |
---|---|
+ | 匹配前面的字符一次及以上 |
* | 匹配前面的字符零次或多次 |
? | 匹配前面的字符零次或一次 |
- | 匹配前面的字符零次或多次(最短匹配) |
普通字符 | 含义 |
---|---|
[ABC] | 匹配方括号中任意一个字符 |
[^ABC] | 匹配除了方括号里的任意一个字符 |
[a-z] | 字符分类,依据编码规则匹配此区间内的任意一个字符 |
. | 匹配任意一个字符 |
预置的字符分类 | 含义 |
---|---|
%a | 字母 |
%c | 控制字符 |
%d | 数字 |
%g | 除空格外的可打印字符 |
%l | 小写字母 |
%p | 标点符号 |
%s | 空白字符 |
%u | 大写字母 |
%w | 字母和数字 |
%x | 十六进制数字 |
注:所有的大写形式表示该分类的补集。
特殊字符 | 含义 |
---|---|
% | 用来转义,所有被转义的字母大概都具有某些特殊含义,而所有被转义的非字母则代表其本身 |
%b | 匹配成对的字符串,类似%b{},则匹配以{开始并以}结束的子串 |
%f | 前置模式,类似%f[%w],则匹配前一个字符不是字母或数字而后一个字符是字母或数字之间的一个空字符串 |
() | 子模式,形如%数字代表捕获的第几个子模式,%0指整个匹配 |