lua, string库函数列表:
string.format
string.gmatch
string.gsub
string.sub
string.len
string.match
string.rep
string.reverse
string.pack/string.unpack/string.packsize
string.upper
string.lower
string.byte
string.char
string.dump
lua, string库函数解释及实例:
---> string.find
函数原型:string.find(str, pattern [, init [, plain]] )
参数说明:
str: 源字符串
pattern: 待搜索模式串
init: 查找的起始位置(可选)
plain: 用法待确定,未用过
函数应用实例:
-- 搜索存在的字符串
print(string.find("wo de jia xiang", 'de') ) -- 输出:4 5
-- 搜索不存在的字符串
print(string.find("wo de jia xiang", 'no') ) -- 输出:nil
-- 模式匹配
print (string.find(" name = Anna ", "(%a+)%s*=%s*(%a+)") ) -- 输出 2 12 name Anna
解释: 如果 find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号。 那么表示会“捕捉”括号括起来的模式匹配到的字符串。 捕捉到后会把他们作为返回值返回,本例中捕捉了两次, 故find 多返回了两个值,“2”和“12”分别表示捕捉到第一个字符串的起始位置和最后一个字符串的结束位置。
-- lua正则表达式的说明(正则表达式可不仅仅可用在find函数,其他可用模式匹配的函数也是通用的):
1. Lua支持的所有字符类:
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表0的字符
上面字符类的大写形式表示小写所代表集合的补集。例如,'%A'非字母的字符:
print(string.find("up-down!", "%A")) -- 输出:3 3
2. 模式匹配的特殊字符 ( ) . % + - * ? [ ^ $
---> string.format
函数应用实例:
print(string.format("%0.2f", 34.2344)) -- 输出:34.23
更多用法
%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E %f - 接受一个数字并将其转化为浮点数格式
%g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
以下是一些例子:
string.format("%%c: %c",83) -- 输出:S
string.format("%+d", 17.0) -- 输出:+17
string.format("%05d", 17) -- 输出:00017
string.format("%o", 17) -- 输出:21
string.format("%u", 3.14) -- 输出:3
string.format("%x", 13) -- 输出:d
string.format("%X", 13) -- 输出:D
string.format("%e", 1000) -- 输出:1.000000e+03
string.format("%E", 1000) -- 输出:1.000000E+03
string.format("%6.3f", 13) -- 输出:13.000
string.format("%q", "One\nTwo") -- 输出:"One\Two"
string.format("%s", "monkey") -- 输出:monkey
string.format("%10s", "monkey") -- 输出: monkey
string.format("%5.3s", "monkey") -- 输出: mon</font>
---> tring.gmatch
函数说明:返回一个迭代函数 可以遍历出现的目标字符串
函数应用实例:
for w in string.gmatch("hello world from Lua", "%a+") do
print(w)
end
-- 输出:
hello
world
from
Lua
---> string.gsub
函数原型:string.gsub(s, pat, repl [, n])
函数功能:返回一个和pat匹配,并且用repl替换的副本。repl可以是string、table和functin。
注意:gsub 调用之后返回 两个值, 一个是替换后的字符串, 第二个是替换的次数
函数应用实例:
function trim(s) return (string.gsub(s, "^%s*(.-)%s*$", "%1"))end
----然后调用:
s='\t a bc d '
print(trim(s)) -----输出: a bc d, 开头的 \t, 结尾的空格 都被 trim 掉了
这里有几点要解释:
1. return (string.gsub(...)), 注意 string.gsub 外面还有一层括号。 事实上, gsub 调用之后返回 两个值, 一个是替换后的字符串, 第二个是替换的次数。 而一旦外面加了括号, 就只返回第一个值, 即替换后的字符串。如果去掉 ^跟$, 那么就不是匹配整个字串, 在 (.-) 的作用下, 输出就成了: abcd 连在一起
2. 匹配模式字串 "^...$", 表示匹配的是整个字符串。 ^ 表开头, $ 表示结尾。在这里, (.-) 的效果跟 (.*) 的效果应该是一样的, 因为反正是从字串开头匹配到结尾。
3. 拷贝捕获(%1-%9):我们可以在模式中使用向前引用,'%d'(d代表1-9的数字)表示第d个捕获的拷贝。
例如,假定你想查找一个字符串中单引号或者双引号引起来的子串,你可能使用模式 '[\"\'].-[\"\']',但是这个模式对处理类似字符串 "it's all right" 会出问题。为了解决这个问题,可以使用向前引用,使用捕获的第一个引号来表示第二个引号: print(string.find("abc \"it\'s a cat\"", "([\"\'])(.-)%1")) -- 输出:5 17 " it's a cat
再例如,print(string.gsub("abcd", "(.)(.)", "%2%1")) -- 输出:badc 2
print(string.gsub("abcd", "(.)(.)", "%1")) -- 输出:ac 2
print(string.gsub("abcd", "(.)(.)", "%1%1")) -- 输出:aacc 2
print(string.gsub("abcd", "(.)(.)", "a")) -- 输出:aa 2
print(string.gsub("abcd", "(.)(.)", "mnk")) -- 输出:mnkmnk 2
---> string.sub
函数说明:string.sub(s,i,j) 函数截取字符串s的从第i个字符到第j个字符之间的串,j可省略,省略后表示到字符串末尾。
函数应用实例:print(string.sub("abcde", 2,-2)) -- 输出:bcd
print(string.sub("abcde", 2)) -- 输出:bcde
---> string.len
函数说明:获取字符串长度
函数应用实例: print(string.len("women")) -- 输出:5
---> string.match
函数说明:与string.find类似 但是返回匹配的子串
函数应用实例: print(string.match("today is 19/2/2001 11/21/20011","%d+/%d+/%d+")) -- 输出:19/2/2001
---> string.rep
函数原型:string.rep(s, n)
函数说明:返回重复n次字符串s的串,你使用string.rep("a", 2^20)可以创建一个1M bytes的字符串
函数应用实例: print(string.rep("abc", 3)) -- 输出:abcabcabc
---> string.reverse
函数原型:string.reverse(str)
函数说明:反转字符串
函数应用实例: print(string.reverse("a b c ")) -- 输出: c b a
---> string.pack/string.unpack/string.packsize -- 使用较少,粗略介绍
pack: lua 5.3 提供的 string.pack 基本就是非官方的 struct 库,使用它可以节省不少对二进制流的处理代码。
unpack: 这个函数从 lua 5.2 开始就从全局函数移到了 table 下,只是因为部分同学的习惯问题而一直没有改过来。这次 lua 5.3 把它从全局变量里删掉了,就逼大家改习惯了。
packsize:大小处理
---> string.upper
函数说明:字母小写变大写
函数应用实例: print(string.upper("姓Wang"))-- 输出:姓WANG
---> string.lower
函数说明:字母大写变小写
函数应用实例: print(string.lower("姓Wang"))-- 输出:姓wang
---> string.byte
函数说明:string.byte(string [,pos]):返回第pos个字符的整数表示形式.如a为97.最多只能指定两个字符
函数应用实例:print(string.byte("abcd", 1)) -- 输出:97
print(string.byte("abcd", 1, 2)) -- 输出:97 98
print(string.byte("abcd", 1, 2, 3)) -- 输出:97 98
---> string.char
函数说明:string.char(i1,i2...):i1,i2为整型,将i1,i2..等转化为对应的字符然后连接成字符串,并返回.如i1=97则返回a.
函数应用实例:print(string.char(98, 99, 100, 101)) -- 输出:bcde
---> string.dump
函数说明:string.dump(function)。返回指定函数的二进制代码(函数必须是Lua函数,并且没有up value)
函数应用实例:将一个函数转换成二进制码,输出;再换回来,输出;再执行:
function DumpTest()
print("string.dump test")
end
local a = string.dump(DumpTest) --将函数DumpTest转换成二进制码
local b = loadstring(a)
print(b) --loadstring(string)可以用来运行一段字符串代码.简单来说,就是把字符串转换成代码。
b()
运行结果:
function: 0xb74e7bd0
string.dump test
注:string.dump可以实现函数序列化,函数可以传递了,甚至把函数传递到另一个进程都可以的。可以实现在其他作用域访问不同的地方的函数。更多的是做框架的时候用的功能,一般写逻辑代码应该用不到。
结束语:本文部分内容来自网上资料通过个人整理得来,供大家参考