lua程序设计(第四版)练习答案自做(第十章)

仓库

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指整个匹配

  1. 其实一般也不用太计较,就像你都选用递归了,那速度也就不是第一要考虑的问题。 ↩︎

  2. 感觉lua采用的模式匹配与sed的策略很相似哎 ↩︎

  3. 如果没有第3个参数,是不能传入第四个参数的 ↩︎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值