lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库。lua的string函数导出在string module中。在lua5.1,同时也作为string类型的成员方法,因此,我们既可以写成string.upper(s), 也可以s:upper(),选择你喜欢的写法。
string.len(s)返回s的长度。
string.rep(s, n)返回重复s字符串n次的字符串。
string.lower(s)返回一份已将大写转成小写的字符串s的拷贝
lower,upper都是使用本地字符集的,另外,如果你想对一个string数组进行排序,并不区分大小写,你可能像这么写:
复制代码 代码如下:
table.sort(a, function(a, b)
return string.lower(a) < string.lower(b)
end)
string.sub(s, i, j)将从s提取一段字符串,从i到j(闭区间[i, j]),当然你可以使用负索引值,将从字符串尾部算起,-1是最后一个字符,-2是倒数第二,等等,这么做的好处是当我们要提取直到末尾几个字符时,从后面数起就很方便。例如:
复制代码 代码如下:
s = "[hello,world]"
print(string.sub(s, 2, -2)) --> hello,world
记住,lua中的字符串是不可变的。
string.char, string.byte用于转换字符和对于的数字之间值。例如:
复制代码 代码如下:
i = 97
print(string.char(i, i+1, i+2)) --> abc
print(string.byte("abc")) --> 97
print(string.byte("abc"), -2) --> 98
lua5.1 string.byte可以接受第三个参数,返回i,j之间的多个值。例如,这么写将字符串转成字符值数组:
复制代码 代码如下:
t = {s.byte(1, -1}
要想重新转成字符串的话:
复制代码 代码如下:
string.char(unpack(t))
string.format是强大字符串格式化函数,和c语言的printf类似,这里不累述。
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还可以给定起始搜索位置,当你想找出所有出现的位置时,这个参数就很有用,例如想知道换行符出现在那些地方:
复制代码 代码如下:
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
string.match和string.find类似,都是在指定的string中查找相应的模式。不同的是,他返回的是找到的那部分string:
复制代码 代码如下:
print(string.match("hello,world","hello")) --> hello
对于像"hello"这样的固定模式来说,这个函数就没啥意义了。但是对于可变模式来说,就显示出他的强大威力了:
复制代码 代码如下:
date = "now is 2014/10/6 17:58"
d = string.match(date, "%d+/%d+/%d+")
print(d) --> 2014/10/6
string.gsub有三个参数,给定字符串,匹配模式和替代字符串。作用就是将所有符合匹配模式的地方都替换成替代字符串。并返回替换后的字符串,以及替换次数。
复制代码 代码如下:
s = string.gsub("Lua is cute", "cute", "great")
print(s) --> Lua is great
string.gmatch函数将返回一个迭代器,用于迭代所有出现在给定字符串中的匹配字符串。
模式:
字符类:(character classes)
复制代码 代码如下:
. all characters
%a letters
%c control characters
%d digits
%l lower -case letters
%p punctuation characters
%s space characters
%u upper-case letters
%w alphanumeric characters
%x hexadecimal digits
%z the character whose representation is 0
他们的大写版本是他本身的互补。
魔法字符:
复制代码 代码如下:
( ) . % + - * "codetitle">复制代码 代码如下:
+ 1 or more repetitions,匹配最长的,
* 0 or more repetitions 最长的
- also 0 or more repetitions 最短的
"codetitle">复制代码 代码如下:
pair = "name = anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) --> name anna
我们也可以将捕获用于模式串自身,"([\"'])(.-)%1",这里的%1表示匹配第一个捕获的一份拷贝。
替换
前面已知道,string.gsub的参数可以是string,其实,也可以是个函数,或是table,如果是函数,就会用捕获的内容作为参数调用该函数,将返回的内容作为替换字符串。如果是table,则用捕获的内容为key去取table的值来作为替换字符串,如果不存在,就不做替换。如:
复制代码 代码如下:
function expand(s)
return string.gsub(s, "$(%w+)", _G)
end
name = "Lua"; status = "great"
print(expand("$name is $status, isn't it"))
(完)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 高胜美《高山情谣SHMCD+K2HD》2CD[低速原抓WAV+CUE]
- 群星《奥运加油热歌精选》[FLAC/分轨][455.15MB]
- 群星《赤热 电视剧音乐原声》[320K/MP3][80.76MB]
- 群星《赤热 电视剧音乐原声》[320K/MP3][427.21MB]
- 周华健.1996-爱的光【滚石】【WAV+CUE】
- 杨宗宪.1996-想啥人怨啥人等啥人【有容唱片】【WAV+CUE】
- 郑秀文.2024-Best.Concert.Live【华纳】【FLAC分轨】
- 《Pax Dei》配置要求一览
- 《过山车之心2》存档位置介绍
- 《三国志8 REMAKE》评测:自定义的三国演义
- 群星《少年白马醉春风 网剧OST原声专辑》[320K/MP3][117.05MB]
- 群星《少年白马醉春风 网剧OST原声专辑》[FLAC/分轨][621.04MB]
- 《魏佳艺5CD合集》[WAV分轨][3.8G]
- CSGO职业选手donk怎么样 2024最新donk个人资料介绍
- CSGO职业选手NiKo怎么样 2024最新Niko个人资料介绍