练习1:请问如何在Lua程序中以字符串的方式使用如下的XML片段:
<![CDATA[
Hello world
]]>
请给出至少两种实现方式
解:
--方法一
page = [[
<![CDATA[
Hello world
[=[ ]] ]=]>
]]
-- 方法二
page = [=[
<![CDATA[
Hello world
[==[ ]] ]==]>
]=]
练习2:假设你需要以字符串常量的形式定义一组包含歧义的转义字符序列,你会用哪种方式?请注意考虑诸如可读性、每行最大长度及字符串最大长度等问题
解:
由于 Lua语言中的字符串常量可以包含任意字节,但是不能滥用这个特性(例如,会导致某些文本编辑器出现异常)。同时,像"\r\n" 一样的EOF序列在被读取的时候可能会被归一化成"\n"。作为替代方案,最好就是把这些可能引起歧义的二进制数据用十进制数值或十六进制的数值转义序列进行表示,例如“\x13\x01\xA1\xBB”。不过,由于这种转义表示形成的字符串往往很长,所以对于长字符串来说仍可能是个问题。针对这种情况,从Lua5.2开始引入了转义序列\z,该转义符会跳过其后的所有空白字符,直到遇到第一个非空白字符。下列中演示了该转义字符的使用方法
data = "\x00\x01\x02\x03\x04\x05\x06\x07\z\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"
第一行最后的\z会跳过其后的EOF和第二行的制表符,因此在最终得到的字符串中,\x08实际上是紧跟\x07的
练习3:请编写一个函数,使之实现在某个字符串的指定位置插入另一个字符串:
> insert("hello world", 1, "start: ") --> start: hello world
> insert("hello world", 7, "small ") --> hello small world
function insert(oldStr, pos, newStr)
return string.sub(oldStr,0,pos) .. newStr .. string.sub(oldStr,pos,string.len(oldstr))
end
练习4:使用UTF-8字符串重写下例:(略)
练习5:请编写一个函数,该函数用于移除指定字符串中的一部分,移除的部分使用起始位置和长度指定
> remove("hello world",7, 4) --> hello d
解:
function remove(str, pos, len)
local newstr = string.sub(str, pos, pos+len-1)
return string.gsub(str, newstr, "")
end
print(remove("hello world", 7, 4))
练习6:使用UTF-8 字符串重写下例:(略)
练习7: 请编写一个函数判断指定的字符串是否为回文字符串
> ispali("step on no pets") --> true
> ispali("banana") --> false
> ispali("anban")
解:
function ispali(str)
local strLen = string.len(str)
local splicePos = math.ceil(strLen / 2)
local spliceStr1 = string.sub(str, 1, splicePos)
local spliceStr2 = string.sub(str, splicePos, strLen)
print(spliceStr1, spliceStr2)
if spliceStr1 == string.reverse(spliceStr2) then
return true
end
return false
end