# String library
lua字符串库包含很多强大的字符操作函数。字符串库中的所有函数都导出在模块string中。在lua5.1中,它还将这些函数导出作为string类型的方法。这样假设要返回一个字符串转的大写形式,可以写成ans = string.upper(s),也能写成 ans = s:upper()。为了避免与之前版本不兼容,此处使用前者。
#### string.byte(s [, i [, j ]])
返回字符s[i ]、s[i + 1]、s[i + 2]、···、s[j ]所对应的ASCII码。i的默认值为1;j的默认值为i。
> 示例代码
~~~
print(string.byte("abc", 1, 3))
print(string.byte("abc", 3)) --缺少第三个参数,第三个参数默认与第二个相同,此时为3
print(string.byte("abc")) --缺少第二个和第三个参数,此时这两个参数都默认为 1
-->output
97 98 99
99
97
~~~
#### string.char (···)
接收0个或更多的整数(整数范围 :0~255);返回这些整数所对应的ASCII码字符组成的字符串。当参数为空时,默认是一个 0。
> 示例代码
~~~
print(string.char(96,97,98))
print(string.char()) --参数为空,默认是一个0,你可以用string.byte(string.char())测试一下
print(string.char(65,66))
-->output
`ab
AB
~~~
#### string.upper(s)
接收一个字符串s,返回一个把所有大写字母变成小写字母的字符串。
> 示例代码
~~~
print(string.upper("Hello Lua")) -->output HELLO LUA
~~~
#### string.lower(s)
接收一个字符串s,返回一个把所有大写字母变成小写字母的字符串。
> 示例代码
~~~
print(string.lower("Hello Lua")) -->output hello lua
~~~
#### string.len(s)
接收一个字符串,返回它的长度。
> 示例代码
~~~
print(string.len("hello lua")) -->output 9
~~~
#### string.find(s, p [, init [, plain]])
在s字符串中第一次匹配 p字符串。若匹配成功,则返回p字符串在s字符串中出现的开始位置和结束位置;若匹配失败,则返回nil。第三个参数init默认为1,并且可以为负整数,当init为负数时,表示从s字符串的string.len(s) + init 索引处开始向后匹配字符串p。第四个参数默认为false,当其为true时,只会把p看成一个字符串对待。
> 示例代码
~~~
print(string.find("abc cba","ab"))
print(string.find("abc cba","ab",2))
--从索引为2的位置开始匹配字符串:ab
print(string.find("abc cba","ba",-1)) --从索引为7的位置开始匹配字符串:ba
print(string.find("abc cba","ba",-3)) --从索引为6的位置开始匹配字符串:ba
print(string.find("abc cba", "(%a+)",1))--从索引为1处匹配最长连续且只含字母的字符串
print(string.find("abc cba", "(%a+)",1,true)) --从索引为1的位置开始匹配字符串:(%a+)
-->output
1 2
nil
nil
6 7
1 3 abc
nil
~~~
#### string.format(formatstring, ···)
按照格式化参数formatstring,返回后面···内容的格式化版本。编写格式化字符串的规则与标准c语言中printf函数的规则基本相同:它由常规文本和指示组成,这些指示控制了每个参数应放到格式化结果的什么位置,及如何放入它们。一个指示由字符'%'加上一个字母组成,这些字母指定了如何格式化参数,例如'd'用于十进制数、'x'用于十六进制数、'o'用于八进制数、'f'用于浮点数、's'用于字符串等。在字符'%'和字母之间可以再指定一些其他选项,用于控制格式的细节。
> 示例代码
~~~
print(string.format("%.4f", 3.1415926)) --保留4位小数
print(string.format("%d %x %o", 31, 31, 31))--十进制数31转换成不同进制
d = 29; m = 7; y = 2015 --一行包含几个语句,用;分开
print(string.format("%s %02d/%02d/%d", "today is:", d, m, y))
-->output
3.1416
31 1f 37
today is: 29/07/2015
~~~
#### string.match(s, p [, init])
在字符串s中匹配字符串p,若匹配成功,则返回目标字符串中与模式匹配的子串;否则返回nil。第三个参数init默认为1,并且可以为负整数,当init为负数时,表示从s字符串的string.len(s) + init 索引处开始向后匹配字符串p。
> 示例代码
~~~
print(string.match("hello lua", "lua"))
print(string.match("lua lua", "lua", 2)) --匹配后面那个lua
print(string.match("lua lua", "hello"))
print(string.match("today is 27/7/2015", "%d+/%d+/%d+"))
-->output
lua
lua
nil
27/7/2015
~~~
#### string.gmatch(s, p)
返回一个迭代器函数,通过这个迭代器函数可以遍历到在字符串s中出现模式串p的所有地方。
> 示例代码
~~~
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do --匹配最长连续且只含字母的字符串
print(w)
end
-->output
hello
world
from
Lua
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%a+)=(%a+)") do --匹配两个最长连续且只含字母的
t[k] = v --字符串,它们之间用等号连接
end
for k, v in pairs(t) do
print (k,v)
end
-->output
to Lua
from world
~~~
#### string.rep(s, n)
返回字符串s的n次拷贝。
> 示例代码
~~~
print(string.rep("abc", 3)) --拷贝3次"abc"
-->output abcabcabc
~~~
#### string.sub(s, i [, j])
返回字符串s中,索引i到索引j之间的子字符串。当j缺省时,默认为-1,也就是字符串s的最后位置。 i可以为负数。当索引i在字符串s的位置在索引j的后面时,将返回一个空字符串。
> 示例代码
~~~
print(string.sub("Hello Lua", 4, 7))
print(string.sub("Hello Lua", 2))
print(string.sub("Hello Lua", 2, 1)) --看到返回什么了吗
print(string.sub("Hello Lua", -3, -1))
-->output
lo L
ello Lua
Lua
~~~
#### string.gsub(s, p, r [, n])
将目标字符串s中所有的子串p替换成字符串r。可选参数n,表示限制替换次数。返回值有两个,第一个是被替换后的字符串,第二个是替换了多少次。
> 示例代码
~~~
print(string.gsub("Lua Lua Lua", "Lua", "hello"))
print(string.gsub("Lua Lua Lua", "Lua", "hello", 2)) --指明第四个参数
-->output
hello hello hello 3
hello hello Lua 2
~~~
#### string.reverse (s)
接收一个字符串s,返回这个字符串的反转。
> 示例代码
~~~
print(string.reverse("Hello Lua")) -->output auL olleH
~~~
#### 字符串连接
使用 ".."字符串连接符,能够把多个字符串连接起来。如果连接符两端出现不是字符串,那么会自动转换成字符串。
> 示例代码
~~~
print( "hello " .. "lua" )
print( "today:" .. os.date()) --你的输出和我一样吗?
-->output
hello lua
today:07/29/15 17:29:24
~~~
- 序
- Lua简介
- Lua环境搭建
- 基础数据类型
- 表达式
- 控制结构
- if/else
- while
- repeat
- 控制结构for的使用
- break,return
- Lua函数
- 函数的定义
- 函数的参数
- 函数的返回值
- 函数回调
- 模块
- String库
- Table库
- 日期时间函数
- 数学库函数
- 文件操作
- 元表
- 面向对象编程
- FFI
- LuaRestyRedisLibrary
- select+set_keepalive组合操作引起的数据读写错误
- redis接口的二次封装(简化建连、拆连等细节)
- redis接口的二次封装(发布订阅)
- pipeline压缩请求数量
- script压缩复杂请求
- LuaCjsonLibrary
- json解析的异常捕获
- 稀疏数组
- 空table编码为array还是object
- 跨平台的库选择
- PostgresNginxModule
- 调用方式简介
- 不支持事务
- 超时
- 健康监测
- SQL注入
- LuaNginxModule
- 执行阶段概念
- 正确的记录日志
- 热装载代码
- 阻塞操作
- 缓存
- sleep
- 定时任务
- 禁止某些终端访问
- 请求返回后继续执行
- 调试
- 调用其他C函数动态库
- 我的lua代码需要调优么
- 变量的共享范围
- 动态限速
- shared.dict 非队列性质
- 如何添加自己的lua api
- 正确使用长链接
- 如何引用第三方resty库
- 使用动态DNS来完成HTTP请求
- 缓存失效风暴
- Lua
- 下标从1开始
- 局部变量
- 判断数组大小
- 非空判断
- 正则表达式
- 不用标准库
- 虚变量
- 函数在调用代码前定义
- 抵制使用module()函数来定义Lua模块
- 点号与冒号操作符的区别
- 测试
- 单元测试
- API测试
- 性能测试
- 持续集成
- 灰度发布
- web服务
- API的设计
- 数据合法性检测
- 协议无痛升级
- 代码规范
- 连接池
- c10k编程
- TIME_WAIT问题
- 与Docker使用的网络瓶颈
- 火焰图
- 什么时候使用
- 显示的是什么
- 如何安装火焰图生成工具
- 如何定位问题