string(字符串)
字符串由一对双引号或单引号来表示
string1="this is a string1"
string2="this is string2"
print(string1)
print(string2)
也可以用2个方括号"[[]]"来表示“一块”字符串。
html=[[
<html>
<head></head>
<body>
<a href="www.baidu.com">百度一下</a>
</body>
</html>
]]
print(html)
在一个数字字符串上进行算术操作时,Lua会尝试将这个数字字符串转成一个数字:
print("2"+6)
print("2" + "6")
print("2+6")
print("-2e2" * "6")
print("hello"+1)
字符串连接使用的是.. ,如:
print("a" .. "b")
print("123" .. "456")
使用#来计算字符串的长度,放在字符串前面,如下
len="www.baidu.com"
print(#len)
print(#"www.baidu.com")
字符串操作
string.upper(argument) 字符串全部转为大写字母
string.lower(argument) 字符串全部转为小写字母
string.sub(s,i,j)
将从s提取一段字符串,从i到j(闭区间[i,j]),也可以使用负索引值,将从字符串尾部算起,-1是最后一个字符,-2是倒数第二,这么做的好处是当我们要提取直到末尾几个字符时,从后面数其非常方便。
s="[hello,world]"
print(string.sub(s,2,-2))
string.gsub(mainString, findString, replaceString, num)
字符串替换操作,mainString为要替换的字符串,findString为被替换的字符,replaceString要替换的字符,num替换次数(可以忽略则全部替换)
print(string.gsub("aaaa","a","z",3))
string.find(str, substr,[init,[end]])
在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回nil
print(string.find("Hello lua user","lua",1))
print(string.find("Hello lua user","lua"))
string.reverse(arg) 字符串反转
print(string.reverse("lua"))
string.format(...) 返回一个类似print的格式化字符串
print(string.format("the value is:%d",4))
string1="Lua"
string2="Tutorial"
-- 基本字符串格式化
print(string.format("basic format %s %s",string1,string2))
-- 日期格式化
date=9; month=8; year=2016
print(string.format("date format %02d/%02d/%03d",date,month,year))
-- 02d表示2表示宽度,如果整数不够2列就补0,如果大于2,无影响
-- 十进制格式化
print(string.format("%.4f",1/3))
string.char(arg)和string.byte(arg[,int])
char将整型数字转成字符并连接,byte转换字符为整数值(可以指定某个字符,默认第一个字符)。
print(string.char(97,98,99,100))
print(string.byte("ABCD",4))
print(string.byte("ABCD"))
-- 字符转换
-- 转换第一个字符
print(string.byte("Lua"))
-- 转换第三个字符
print(string.byte("Lua",3))
-- 转换末尾第一个字符
print(string.byte("Lua",-1))
-- 第二个字符
print(string.byte("Lua",2))
-- 转换末尾第二个字符
print(string.byte("Lua",-2))
-- 整数ASCII码转换为字符
print(string.char(97))
string.len(arg) 计算字符串长度
print(string.len("abc"))
string.rep(string,n) 返回字符串string的n个拷贝
print(string.rep("abcd",2))
.. 连接两个字符串
print("www.bidu"..".com")
模式匹配
Lua string库里最强大的函数是那些模式匹配函数:find,match,gsub,gmatch。和其他脚本语言不通,Lua既没有用POSIX的正则表达式,也没有用perl的正则表达式。原因是实现这些导致lua占用更多内存,而Lua的初衷是小巧的,嵌入应用的语言。Lua用少于500行的代码实现了自己的一套模式匹配,虽然不如标准的正则表达式强(一般需要4000以上代码),但也足够强大。
string.find将查找目标模板在给定字符串中出现的位置,找到返回起始和结束位置,没找到返回nil。
s="hello,world"
i,j = string.find(s,"hello")
print(string.sub(s,i,j))
string.find还可以给定起始搜索位置,当你想找出所有出现的位置时,这个参数就很有用,例如想知道换行符出现在那些地方:
s="hello\nworld\nnihao\n"
local t={}
local i=0
while true do
i=string.find(s,"\n",i+1)
if i==nil then
break
end
t[#t+1]=i
end
for i,v in ipairs(t) do
print(i.."--"..v)
end
string.match和string.find类似,都市在指定的string中查找相应的模式。不同的是,它返回的是找到的那部分string
print(string.match("hello,world","hello"))
对于可变模式
date="now is 2016/8/9 10:51"
date_m=string.match(date,"%d+/%d+/%d+")
print(date_m)
string.gsub有三个参数,给定字符串,匹配模式和替代字符串。作用就是将所有符合匹配模式的地方都替换成替代字符串。并返回替换后的字符串,以及替换次数。
s,n=string.gsub("Lua is cute","cute","great")
print(s,n)
string.gmatch函数将返回一个迭代器,用于迭代所有出现在给定字符串中的匹配字符。
Lua支持的所有字符类:
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
% s 空白符
%u 大写字符
%w 字母和数字
%x 十六进制数字
%z 代表0的字符
上面字符类的大写形式表示小写所代表的集合的补集。例如“%A”表示非字母的字符print(string.gsub("hello,world!","%A","."))
Lua模式匹配中的特殊字符
() % + - * ? [ ^ $
'^'开头表示只匹配目标串的开始部分
如果作用在集合中,补集 [^0-9]表示非数字
'$'结尾表示只匹配目标串的结尾部分
可以使用修饰符来修饰模式增强模式的表达能力,Lua中的模式修饰符有4个:
+ >=1
* >=0
- >=1
? 0次或1词
‘+’匹配一个或多个字符,总是进行最长的匹配。
‘-’匹配一个或多个字符,总是进行最短匹配。
捕获
捕获机制允许一个模式串中的一部分来匹配目标串中的一部分。写法是模式串中你需要捕获的那部分用()括起来。
pair="name = yhk"
key, value=string.match(pair,"(%a+)%s*=%s*(%a+)")
print(key,value)
分隔字符串
s="aA_B_C"
t=string.gmatch(s,"%a+")
print(t)
print(type(t))
a={}
for w in t do
table.insert(a,w)
end
for k,v in pairs(a) do
print(k,v)
end
s="12 aA B C"
a={}
id,sent=string.match(s,"(%d+)\t+(.+)")
print(id)
print(type(id))
print(sent)
print(type(sent))