侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Lua字符串库(string库)学习笔记

技术  /  管理员 发布于 3年前   221

Lua 最强大的特性之一就是它的字符串处理能力,它支持字符格式化输出,具有可扩展的模式匹配查找功能,以及一些实用的字符操作,例如查询、截取、替换和删除等字符串操作,这些字符串操作函数都封装在一个名为 string 的模块里。

Lua 里的字符索引是从 1 开始,索引值也可以是负数,这种情况将被解释成向后索引,从字符串末尾开始算起。

下面是 Lua 5.2 提供的字符串操作函数:

byte

函数 string.byte 把字符串里的第 i 个字符转为 ASCII 编码,默认是输出第一个字符的编码(只有一个参数的话),用法:

复制代码 代码如下:
string.byte (s [, i [, j]])

例子:

复制代码 代码如下:
print(string.byte("abc")) //echo:97

print(string.byte("abc", 2))//echo:98

char

函数 string.char 是把一个 ASCII 编码转换为对应的字符,用法:

复制代码 代码如下:
string.char (asc1, ...)

例子:

复制代码 代码如下:
print(string.char(97)) //echo a

print(string.char(99, 100, 101)) //echo cde

dump

函数 string.dump 返回一个函数二进制形式的字符串,用法:

复制代码 代码如下:
string.dump (function)

参数 function 是一个 Lua 函数:

复制代码 代码如下:
function test()
    print("just a test")
end
print(string.dump(test))

函数 string.dump 实现了函数的序列化,函数可以很轻松的传递,并在其他作用域调用。函数 string.dump 出来的二进制字符串,可以用 load 函数反序列回来直接调用。

复制代码 代码如下:
function test()
    print("just a test")
end
local sd = string.dump(test)
print(sd)
local ls = load(sd)
print(ls)
ls()

find

函数 string.find 查找字符串 s 里第一个符合查找字符 pattern 的位置,用法:

复制代码 代码如下:
string.find (s, pattern [, init [, plain]])

如果找到了目标字符 pattern,则返回它的开始和结束位置:

复制代码 代码如下:
start, end = string.find("just a test", "st")
print(start, end)

如果没有找到,则返回 nil:

复制代码 代码如下:
print(string.find("just a test", "dhq.me"))

format

函数 string.format 用于把字符串格式化输出,用法:

复制代码 代码如下:
string.format (formatstring, ・・・)

string.format 函数的第一个参数是用来指定字符串的格式,例如:

复制代码 代码如下:
print(string.format("%s is %d", "ten", 10))

上面例子里的 %s 表示字符串,%d 表示数字,它们是 Lua 的格式化输出符号。

string.format 函数的用法跟 C 语言里的 printf 函数类似,例如它可以像 printf 那样输出指定位数的数字:

复制代码 代码如下:
Pi = 3.1415926
print(string.format("Pi is %.2f", Pi))

Lua 的字符格式化输出符号列表:

复制代码 代码如下:
.           所有字符
%a          字母
%c          控制符
%d          数字
%D          非数字
%l          小写字母
%p          标点符号
%s          字符串
%u          大写字母
%w          字母数字
%x          十六进制数
%z          用 0 表示的字符

gmatch

函数 string.gmatch 会返回一个迭代函数,⊥ü煤槔揭桓鲎址 s 中所有出现指定匹配模式 pattern 的地方,用法:

复制代码 代码如下:
string.gmatch (s, pattern)

例如下面是找出字符串 s 里的所有单词:

复制代码 代码如下:
s = "just a test"
for w in string.gmatch(s, "%a+") do
    print(w)
end

gsub

函数 string.gsub 用于全局字符串替换,字符串 s 里满足匹配模式 pattern 格式的字符都会被替换成 repl 参数的值,用法:

复制代码 代码如下:
string.gsub (s, pattern, repl [, n])

例如:

复制代码 代码如下:
print(string.gsub("just a test", "st", "*"))

匹配模式 pattern 可以是一个正则:

复制代码 代码如下:
s = "num is 1234567890"
print(string.gsub(s, "%d", "*"))

可在函数的最后加上一个可选参数 n,表示指定要替换的次数:

复制代码 代码如下:
s = "sethook, setlocal, setmetatable, setupvalue, setuservalue"
print(string.gsub(s, "s%a+", "S", 2))

len

函数 string.len 用于返回字符串 s 的长度,用法:

复制代码 代码如下:
string.len (s)

例子:
复制代码 代码如下:
print(string.len("abcdefg"))

lower

函数 string.lower 用于把字符串 s 里的字母转为小写,用法:

复制代码 代码如下:
string.lower (s)

例如:

复制代码 代码如下:
print(string.lower("AbCdEfG"))

match

函数 string.match 用于查找字符串 s 里第一个匹配对模式 pattern 的值,并返回匹配值,用法:

复制代码 代码如下:
string.match (s, pattern [, init])

上面参数 init 是可选, 表示查找过程的起点, 默认从 1 开始:

复制代码 代码如下:
print(string.match("just a test", "test"))

参数 patter 可以是一个正则模式:

复制代码 代码如下:
t = "today is 2003-5-31"
print(string.match(t, "%d+-%d+-%d+"))

如果 pattern 为空,则返回整个字符串;如果没匹配成功,则返回 nil。

复制代码 代码如下:
print(string.match("abcdabcd", "a"))

rep

函数 string.rep 返回一个由分隔符 sep 隔开的重复(repeat)n 次字符 s 的字符串,用法:

复制代码 代码如下:
string.rep (s, n [, sep])

默认的分隔符 sep 是空字符。

复制代码 代码如下:
print(string.rep("repeat", 3))

reverse

函数 string.reverse 用于倒转一个字符串 s 的排序,用法:

复制代码 代码如下:
string.reverse (s)

例如:

复制代码 代码如下:
print(string.reverse("reverse"))

sub

函数 string.sub 用于从字符串 s 里截取一个从第 i 个字符到第 j 个字符间的子字符串,用法:

复制代码 代码如下:
string.sub (s, i [, j])

例如:

复制代码 代码如下:
print(string.sub("abcdefg", 2, 5))

参数 i 可以是负数,这种情况下,子串的位置从字符串 s 的最后开始算起:

复制代码 代码如下:
print(string.sub("abcdefg", -4, -2))

参数 end 省略的话,则会返回从 i 到字符串末尾的子字符串:

复制代码 代码如下:
print(string.sub("abcdefg", 3))

upper

函数 string.upper 用于把字符串 s 里的字母转为大写,用法:

复制代码 代码如下:
string.upper (s)

例如:

复制代码 代码如下:
print(string.upper("AbCdEfG"))


  • 上一条:
    lnmp+laravel+mysql主从复制,读写分离,今天前几天复制到阈值了加第三台服务器
    下一条:
    opcache.so让你的php服务器性能提升10倍,丝毫不夸张
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 性能测试工具、HTTP基准测试工具:wrk(0个评论)
    • namesilo域名+香港服务器+acme.sh给网站生成免费ssl证书流程步骤(0个评论)
    • 控制反转IOC设计模式简单的示例代码(0个评论)
    • 来自京东开发者的接口优化的常见方案实战总结(0个评论)
    • 最新访问谷歌Google镜像/学术/搜索_GitHub镜像/下载加速链接2023/2/16持续更新(0个评论)
    • 近期文章
    • ChatGPT再出新功能,推出插件功能,能联网、搜索了(0个评论)
    • 在go语言中使用GoPDF包把html生成PDF文件示例(0个评论)
    • 在go语言中创建和解析(读取)符号链接示例(0个评论)
    • ubuntu 22.04系统中报错:Python 3.6 is no longer supported by the Python core team...解决方式(0个评论)
    • Laravel 10.4版本发布(0个评论)
    • mysql5.7中实现分区表及分区where in查询示例及分区分表对比浅析(0个评论)
    • nginx + vue配置实现同域名下不同路径访问不同项目(0个评论)
    • 在laravel框架中的5个HTTP客户端技巧分享(0个评论)
    • 在go语言中使用FFmpeg库实现PCM音频文件编码为mp3格式文件流程步骤(0个评论)
    • gopacket免安装Pcap实现驱动层流量抓包流程步骤(0个评论)
    • 近期评论
    • 博主 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..
    • xiaoB 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..
    • BUG4 在

      你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..
    • 博主 在

      go语言+beego框架中获取get,post请求的所有参数中评论 @ t1  直接在router.go文件中配就ok..
    • Jade 在

      如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客