您现在的位置是:网站首页 -> 后端开发 文章内容
Lua math string库-itarticl.cc-IT技术类文章记录&分享
发布时间: 8年前【后端开发】 132人已围观【返回】
函数名 描述 示例 结果
pi 圆周率 math.pi 3.1415926535898
abs 取绝对值 math.abs(-2012) 2012
ceil 向上取整 math.ceil(9.1) 10
floor 向下取整 math.floor(9.9) 9
max 取参数最大值 math.max(2,4,6,8) 8
min 取参数最小值 math.min(2,4,6,8) 2
pow 计算x的y次幂 math.pow(2,16) 65536
sqrt 开平方 math.sqrt(65536) 256
mod 取模 math.mod(65535,2) 1
modf 取整数和小数部分 math.modf(20.12) 20 0.12
randomseed 设随机数种子 math.randomseed(os.time())
random 取随机数 math.random(5,90) 5~90
rad 角度转弧度 math.rad(180) 3.1415926535898
deg 弧度转角度 math.deg(math.pi) 180
exp e的x次方 math.exp(4) 54.598150033144
log 计算x的自然对数 math.log(54.598150033144) 4
log10 计算10为底,x的对数 math.log10(1000) 3
frexp 将参数拆成x * (2 ^ y)的形式 math.frexp(160) 0.625 8
ldexp 计算x * (2 ^ y) math.ldexp(0.625,8) 160
sin 正弦 math.sin(math.rad(30)) 0.5
cos 余弦 math.cos(math.rad(60)) 0.5
tan 正切 math.tan(math.rad(45)) 1
asin 反正弦 math.deg(math.asin(0.5)) 30
acos 反余弦 math.deg(math.acos(0.5)) 60
atan 反正切 math.deg(math.atan(1)) 45
一、string基础。
Lua并没有字符类型,Lua的string类型表示字符序列。长度为1的string就表示了单个字符。Lua的字符类型有这些特征:
1、string字符序列中的字符采用完全8位编码,即可以存放任何二进制数据。
2、string是不可变的值。相当于java中的String类。每次修改都会返回一个新的string,而原有的string保持不变。如:
a = "abc"
b = a
a = "cba"
print(a) -->cba
print(b) -->abc
3、string的字面值,用匹配的单引号、双引号括起来都行。同时跟其他语言一样可以用反斜杠“\”的转义序列。如:
c = ‘abc\ndef’
print(c) -->输出换行了
4、可以通过<转义符“\”+数值>来指定字符串中的字符,数值为最多3位数组成的序列。如:
d = "\97\98c"
print(d) --abc
5、可以用一对[[XXX]]来界定一个字符串XXX。字符串可以为任意字符。如:
e = [[it's mine!
it's not yours! --'Oh' --"Wow!!!!"
]]
print (e) --输出[[]]里面的所有内容
6、如上的表示有一个bug,就是当字符串包含[[或]]子串的时候,会表达错误。Lua提供了[===[XXX]===]这样的形式来包含字符串XXX。其中,两边中括号之间的“=”数量要匹配。如:
f = [==[abc[=]defgh[[=]]]==]
print(f) --abc[=]defgh[[=]]
7、Lua提供运行时数字和字符的自动转换。即一个数字和一个字符串相加,Lua会尝试把这个字符串转换成数字再求值。不需要我们显式转换。如:
print("5"+6) --11
8、长度操作符“#”,可用于求字符串的长度,即字符串包含的字符数。如:
print(#"abcd\n") --5
str = "abc"
print(#str) --3
二、string库
(科普一下,估计有不少Lua初学者跟我一样第一次看到Lua的API的时候都会很奇怪,像string.byte (s [, i [, j]])里面这些“[]”都是些什么来的?呵呵,中括号代表可选的参数。
就是说,可以这样调用:string.byte("abc"),也可以这样调用:string.byte("abc",1),当然也可以这样调用:string.byte ("abc",1,-1);)
1、string.byte (s [, i [, j]])
返回字符串的内部数字编码,i、j为字符串的索引,i、j限定了多少字符就返回多少值。如下:
k1,k2,k3 = string.byte("abcdef",1,3)
print (k1,k2,k3) --97 98 99
2、string.char (···)
跟byte()相反,把数字编码转换为字符串。如下:
s = string.char(97,98,99)
print(s) --abc
n = string.char()
print(n) --什么都没输出
print(type(n)) --string
print(string.char(string.byte("hello",1,-2))) --hell
3、string.dump (function [, strip])
这个函数是用来序列化函数的。传入一个函数,返回一个字符串。通过load该字符串可以反序列化该函数。用法如下:
function max( a,b )
return a>b and a or b
end
--序列化
du = string.dump(max)
print(type(du)) --string
print(du) --LuaQ
--反序列化
max2 = load(du)
--调用函数
print(max2(1,2)) --2
4、string.find (s, pattern [, init [, plain]])
string.find()函数用于在一个给定的目标字符串中搜索一个模式。最简单的模式就是一个单词,它只会匹配与自己完全相同的拷贝。当find找到一个模式后,它会返回两个值:匹配到的起始索引和结尾索引;如果没有找到任何匹配,它就返回nil。示例代码:
local str = "Hello World"
local i, j = string.find(str, "Hello") -- 返回Hello在str中的起始位置和终止位置
print(i, j)
string.find函数还具有一个可选的第三个参数,它是一个索引,告诉函数应该从目标字符串的哪个位置开始搜索。当我们处理一个字符串中与给定模式相匹配的所以内容时,这个设置是非常有用的。我们可以循环的进行查找操作。当然了,这里只是说了最普通,也是最简单的一种方式,对于第二个参数,我们完全可以传递一个正则表达式,也就是一个pattern,进行正则匹配。示例代码:
local str = "Hello12345World"
local i, j = string.find(str, "%d+")
print(i, j) -- 6 10
5、string.format (formatstring, ···)
这个函数用来格式化字符串。API文档很复杂,用法很多,可查看文档。当format字符串中含用%号时,会出现一种不向下执行也 不报错的状态, 这种情况下的解决办法是:先把format字符串中的%号替换为%%即可. string.gsub(str, "%%", "%%%%") ,这里的两个%号表示是%号 如下:
print(string.format("i want %d apples", 5)) --i want 5 apples
6、string.match (s, pattern [, init])
这个函数与find()函数类似,不同的是,find返回匹配的索引,这个函数返回第一个匹配的内容本身,如下:
local str = "Hello12345World"
local subStr = string.match(str, "%d+")
print(subStr)
local i, j =string.find(str, "%d+")
subStr =string.sub(str, i, j)
print(subStr)
-- 是不是可以认为match等于find + sub呢?
7、string.gsub(str, pattern, repl, n)
string.gsub有3个参数:目标字符串、模式和替换字符串。它的基本用法是将目标字符串中所有出现模式的地方替换为目标字符串。来看一段简短的代码,就什么都明白了。
local str = "Hello World"
local strResult = string.gsub(str, "Hello", "Jelly")
print(strResult) -- Jelly World
另外gsub还有可选的第四个参数,可以限制替换的次数。示例代码如下:
local str = "Hello World"
-- 这里不限制替换次数
local strResult, cnt = string.gsub(str, "l", "o")
print(strResult) -- Heooo Worod
print(cnt) -- 实际替换的次数
-- 开始限制替换次数
strResult, cnt = string.gsub(str, "l", "o", 1)
print(strResult) -- Heolo World
print(cnt) -- 就替换了一次
这里还有重点需要介绍,也就是gsub的强大之处。先看一段代码,然后再做介绍。
local replaceTb = {hello = "Jelly", world = "Think"}
local str = "hello world"
-- 注意,第3个参数是一个table
local strResult = string.gsub(str, "hello", replaceTb)
print(strResult) -- Jelly world
strResult = string.gsub(strResult, "world", replaceTb)
print(strResult) -- Jelly Think
strResult = string.gsub(strResult, "hello", replaceTb)
print(strResult) -- Jelly Think
可以看到,gsub的第三个参数是一个table,也就是说,当gsub的第三个参数是一个table时,如果在查找的字符串中有与第二个参数相匹配的内容,就会将该内容作为key,在table中查找该key对应的value;如果该table中没有这个key,则不进行替换;上面的代码就是表明这个意思。接下来再来看一段比较神奇的代码:
local replaceFunc = function (str)
return str .. "JellyThink"
end
local str = "hello world"
-- 注意,第3个参数是一个Func
local strResult = string.gsub(str, "hello", replaceFunc)
print(strResult) -- helloJellyThink world
没有看错,gsub的第三个参数还可以是一个函数,该函数的参数是被匹配的字符串,该函数的返回值将会作为目标字符串去进行替换匹配的内容。
8、string.gmatch(str, pattern)
我也不知道要怎么形容gmatch,gmatch会返回一个迭代器函数,你可以使用这个迭代器函数去迭代匹配的所有内容。看下列代码:
local str = "Hello World"
local iteratorFunc = string.gmatch(str, "%a+") -- %a+表示匹配所有单词
for i in iteratorFunc do
print(i)
end
如果你对迭代器还不熟悉的话,可以看这里。我现在就使用find来实现一个我们自己的gmatch,功能和gmatch是差不多的。代码如下:
local str = "Hello World"
-- 使用find来实现一个自己的gmatch
local myGmatch = function (s, pattern)
local resultTb = {} -- 相当于迭代器中的恒定状态
local index = 0 -- 相当于迭代器中的控制变量
local i, j = string.find(s, pattern)
while i do
resultTb[#resultTb + 1] = string.sub(s, i, j)
i, j = string.find(s, pattern, j + 1)
end
return function () -- 返回一个迭代器函数
index = index + 1
return resultTb[index]
end
end
for i in myGmatch(str, "%a+") do
print(i)
end
9、string.len (s)、string.lower (s)、string.upper (s)
这个两个函数都太简单了,一个是求字符串的长度。另一个是将字符串转换为小写。如下:
print(string.len("abcd")) --4
print(string.lower("MACOS")) --macos
print(string.upper("12abAB")) --12ABAB
10、string.rep (s, n [, sep])
这个函数就是用来将某个字符串自我复制链接起来。如下:
print(string.rep("s", 5,"-")) --s-s-s-s-s
print(string.rep("ab", 5)) --ababababab
11、string.reverse (s)
如名,用来反转字符串,反转字符串中字符的序列。如下:
print(string.reverse("abcdefg")) --gfedcba
12、string.sub (s, i [, j])
这个函数就是用来截取字符串。很简单,如下:
print(string.sub("abcdefg", 3,5)) --cde
发布时间: 8年前【后端开发】132人已围观【返回】【回到顶端】
很赞哦! (1)
下一篇:pbc默认值问题
相关文章
点击排行

站长推荐

猜你喜欢
站点信息
- 建站时间:2016-04-01
- 文章统计:728条
- 文章评论:82条
- QQ群二维码:扫描二维码,互相交流
