[lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库
L1[string]01. ASCII码互转
小知识:字符串处理的几个共同的几点
1.字符串处理函数 字符串索引可以为负数 表示从字符串末尾开始算起 所有字符串处理函数的 字符串索引参数都使用
2.所有的字符串处理函数 其实可以用另外一种形式来显示 面向对象的方式 把string 看作是一个类 该类下面存在很多 类方法 比如string.sub string.char 等等 每个字符串其实都可以看作是string类的一个实例 所以 我们可以使用 这样的形式来调用字符串处理函数 如下面的形式
yy="test"
print(yy.byte(yy))--正常是string.byte(yy) 不过看到这个形式也不要认不出来
3.string字符串处理库 并不支持汉字 需要的话去看5.3独有的utf8库
小知识:ASCII转换
2个函数
string.byte()和string.char() 可以把数字和字符 以ascII的对应关系相互转化
个人理解的几个常见的用处
math.randomseed(os.time())
--依次输出a-z字母
for i=string.byte("a"),string.byte("z") do
print(string.char(i))
end
--配合随机函数随机输出字母
print("======================")
for i=1,10 do
print(string.char(math.random(string.byte("a"),string.byte("z"))))
end
--可以输出一些不太常见或者不太好输出的字符
--"fdsd\"dsf123" 比如这个中间的双引号(双引号在ascII 编号是34) 我们可以用\转义一下避免报错 其实也可以用string.char()
print("fdsd\"dsf123")--去掉双引号的歧义
print("fdsd\034dsf123")--字符串转义字符\034代表aSCII的双引号
print("fdsd" .. string.char(34) .. "dsf123")
注意:string.byte() 第二个参数是从哪个字符开始转化 第三个是转化结束位置 一旦要转化的字符不存在 或者存在问题 会返回nil 这个要注意 这个函数并不是一定会返回数值 使用它注意判断nil的情况 切记
string.char()也是可以同时转化多个 没什么可说的 但是一旦string.char()参数值超出了ASCII的编码上限 它会直接报错 连返回nil的机会都没。。lua果然是很久以前的语法 在严谨程度上还是不够啊
x1,x2,x3,x4=string.char(97,98,99,100)—a,b,c,d
L1[string]02. 查找与截取字符串
1.string.find() 查找
找到了返回位置 返回2个数值 第一个表示找到字符串开头位置 第二个是结尾位置 找不到返回nil 并且支持正则 真是老语法 果然逻辑还是不完美
其实找不到可以返回-1 这样都返回数值 在判断返回值和比较的时候就铁定不会报错 万一返回nil 要和其他数值比较就直接崩溃了代码 等后面想想把string.find()重构一下 等后面再说
可以考虑每次string.find的结果 处理一下
yy="sdfwerew213dfw2134ds23dfs324dsfr2423"
temp,temp2=string.find(yy,"2113")
temp=temp or -1
temp2=temp2 or -1
2.string.sub(str,i,j) 截取
常见用法
string.sub(str,1,j)--从开头开始取长度为j的子字符串
string.sub(str,-j)-从末尾倒取长度为j的字符串
从尾部取
yy="sdfwerew213dfw2134ds23dfs324dsfr2423"
temp=string.sub(yy,-4,-1)
temp=temp or ""--为了避免结果为nil 取不到就返回一个空字符串就好 何必是nil
print(temp)
第二个参数不会小于1 也不会超出整个字符串长度 如果小于或者超出了就回归1
第三个参数不写默认为-1 写了但是超出了字符串本身的长度 则恢复默认为字符串长度
3.string.gsub() 替换 相当于按键的replace 但是功能更加的强大
支持正则表达式 并且最后那个参数支持自定义函数 功能非常强大 不过这里我们就不多说了 下面就是用string.gsub构成的分割函数
function string.split(s, p)
if s == nil then
return nil;
end
if p == nil then
return s;
end
local rt= {};
s = tostring(s);
string.gsub(s, '[^'..p..']+', function(w) table.insert(rt, w) end );
return rt;
end
4.string.match() 匹配
好吧 还是匹配不到就返回nil 所以我还是想等过段时间重载这个函数
yy="sdfwerew213fsdfw2134ds23dfs324dsfr24fs23"
temp=string.match(yy,"f12s")
temp=temp or "" --还是如果匹配不到就返回空字符串就可以了
print("[" .. temp .. "]")
匹配结果规则
如果pattern里面没有括号存在 那么会按照正则表达式匹配出 整个字符串 如果pattern里面存在括号 那么就显示括号匹配的内容 而不显示整个pattern匹配得整个字符串了
local strContent = [[abcde csdn = {博客} csdn.net]]
local strPattern = [[^(.*)(csdn%s*=%s*)(%b{})(.*)$]]
--local strPattern = "^.*csdn%s*=%s*%b{}.*$"
local strCapture1, strCapture2, strCapture3, strCapture4 = string.match(strContent, strPattern)
print(strCapture1, strCapture2, strCapture3, strCapture4)--abcde csdn = {博客} csdn.net
5 string.gmatch() 匹配出全部符合要求的 返回得是一个迭代器(类型其实是个function) 而不是string.match()那样得 而且迭代器返回的不一定是一个变量
--从网页源码提取出手机号码和对应的账号信息
local str = [[
<li class="flexs flex-column li_root" name="one" num="15306314623">第1个账号</li>
<li class="flexs flex-column li_root" name="one" num="15306314624">第2个账号</li>
<li class="flexs flex-column li_root" name="one" num="15306314625">第3个账号</li>
<li class="flexs flex-column li_root" name="one" num="15306314626">第4个账号</li>
<li class="flexs flex-column li_root" name="one" num="15306314627">第5个账号</li>
<li class="flexs flex-column li_root" name="one" num="15306314628">第6个账号</li>
<li class="flexs flex-column li_root" name="one" num="15306314629">第7个账号</li>
<li class="flexs flex-column li_root" name="one" num="15306314630">第8个账号</li> ]]
--设置pattern
local strPattern=[[name="one" num="(1[3-9]%d%d%d%d%d%d%d%d%d)">(.-)</li>]]--使用[[]]构建pattern注意写完后输出一下看看构建的pattern是否满足自己的要求
print(strPattern)
print(string.match(str,strPattern))
--遍历输出所有匹配到的内容
for v,k in string.gmatch(str, strPattern) do
print(v,k)
end
结果:
name="one" num="(1[3-9]%d%d%d%d%d%d%d%d%d)">(.-)</li>
15306314623 第1个账号
15306314623 第1个账号
15306314624 第2个账号
15306314625 第3个账号
15306314626 第4个账号
15306314627 第5个账号
15306314628 第6个账号
15306314629 第7个账号
15306314630 第8个账号
程序于 0.26 秒完成 (pid: 14924).
知识点:lua正则的相关知识
https://blog.csdn.net/fightsyj/article/details/83615498 比较详细的正则资料 包含元字符 各种元字符例子 和4个正则相关的函数 实现查找 替换匹配
lua下正则的几个特别之处
1.%b
匹配对称字符,一般写法为"%bxy",x为开始匹配字符,y为结束匹配字符,xy可随意指定
例如:"%b<>"为匹配包括<>在内的所有字符 %b后面只能跟2个符号 无法跟多个
2.-
最小匹配 就是常见的懒惰匹配符号-
str = "ab12345ed"
print(string.match(str, "%d-")) --空字符串 注意-单独使用的时候 它可以代表0次和多次 最少是代表0次 并且是最小匹配 自然就是0次 不要单独使用他 没有什么意义
3 lua的正则和一般正则而言缺少的元字符 | 和 {}
一个表示选择的| 另外1个是表示重复数量的{} 在lua正则下 | {} 不是元字符切记
--匹配出手机号码
str = "qsasd15166158515asdaf"
print(string.match(str, "1[3-9]%d%d%d%d%d%d%d%d%d")) -- 15166158515
print(string.match(str, "1[3-9]%d{9}")) -- nil 因为lua的元字符里面没有{}设置重复次数
4 去掉两边空格 还有检测是否是数值是否是字符串 是否是空格等等常见用法 属于一般的用途 正则是个需要不断练习和测试的积累 不过每次写lua正则 建议先看一遍lua的元字符
function testlib:trim (s)
return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end
L1[string]03. 转大小写与重复字符
6.string.rep() 获取重复N个的字符串
print(string.rep("hello",10))—hellohellohellohellohellohellohellohellohellohello
7 string.reverse() 逆转字符串 没什么说的
8 string.lower string.upper
9 string.len() 推荐用#获取字符串长度 和 数字索引表的长度
L1[string]04. 格式化字符串
string.format()
注意 %d %s 对应的变量 这些变量一定要检测是不是对应的变量类型 如果对应的变量类型不符合 就会代码报错崩溃
%d是代表0-9的整数 不包含小数点 而且可以控制数字的长度 比如
x=14 string.format(“x=%3d”,x)--x=14
x=14 print(string.format("x=%5d",x))x= 14 --14前面多了3个空格
%f 表示小数 而且可以控制小数点位数 %.2f 表示保留两位小数
%s 表示字符串 用法没什么说的
%x 会自动把对应的数字转化为十六进制显示 一般永不打上
%X - 接受一个数字并将其转化为大写的十六进制格式
注意 这个和正则元字符不是一个东西 不要混淆了
注意:会根据情况自动内部转化类型 除非无法转化才会崩溃 为了避免这个情况 可以这样处理
x=10
y=11
z=12
print(string.format("x=%s,y=%s,z=%s",tostring(x),tostring(y),tostring(z))) --这样都转化为字符串 匹配字符串里面都是%s 可以避免报错崩溃
[lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库的更多相关文章
- [lua]紫猫lua教程-命令宝典-L1-01-03. 数值数据
lua5.3在线手册地址 https://cloudwu.github.io/lua53doc/contents.html#contents 其实我们直接啃手册就够了 推荐如果有基础的先啃手册再看紫 ...
- [lua]紫猫lua教程-命令宝典-L1-01-02. 变量
L1[变量]01. 变量命名规则 命名规则:数字字母下划线构成 但是不能数字开头 不推荐中文名 很多都是不支持中文 但是在一些其他的编辑器里面 比如触摸精灵 之类的 就可以 注意 :变量命名必须要包含 ...
- [lua]紫猫lua教程-命令宝典-L1-01-01. Lua环境与IDE
网上大把的lua教程 不过紫猫老师的教程向来都是讲的非常仔细 所以最近天气已经36+了 魔兽世界还需要冲飞行声望 懒得写单子根本没有单子,正好认认真真的看下紫猫老师的lua教程 紫猫老师的lua教 ...
- [lua]紫猫lua教程-命令宝典-L1-01-04. 字符串数据
L1[字符串]01. 单引号与双引号 没什么说得 字符串:以双引号包含 或者单引号包含 或者[[]]包含 L1[字符串]02. 长文本内容 小知识:如果用[[]]包含字符串内容 但是字符串内容里面 包 ...
- [lua]紫猫lua教程-命令宝典-L1-01-10. 自定义函数
L1[function]01. 定义与调用函数 函数的定义 和概念 没什么可说的 lua的函数声明和调用是有先后顺序的 先声明后调用 函数就是变量的一种 所以可以自由的把函数在变量间相互赋值 不过注 ...
- [lua]紫猫lua教程-命令宝典-L1-01-07. table表
L1[table]01. table表的定义与赋值 小知识:声明表的例子 xx={}--创建一个空表xx --给这表的元素赋值 test="a" xx[test]="a& ...
- [lua]紫猫lua教程-命令宝典-L1-01-11. lua的个人补充
1.关于三目运算符的一些补充和纠正 前面没看仔细 a>b ? a: b 这个形式 似乎lua下并不存在...要了命 一般都是使用 a and b or c 的形式 但是这种形式存在一些问题 ...
- [lua]紫猫lua教程-命令宝典-L1-03-01. 闭包
L1[闭包]01. 函数的传递赋值 没什么说的 1.函数作为变量来看 可以轻松的声明 相互赋值 2.函数变量本质是 一个内存指针 所以函数变量的相互赋值不是传递的函数本身 而是指向这个函数的内存地址 ...
- [lua]紫猫lua教程-命令宝典-L1-01-08. math数学函数库
L1[math]01. 取绝对值 L1[math]02. 三角函数 小知识:注意 lua下三角函数用的参数是弧度 而不是角度 弧度=角度*pi/180 -->弧度角度换算公式 lua的mat ...
随机推荐
- how to use bookdown
模板下载 {#moban} 谢益辉 通用模板:https://github.com/rstudio/bookdown-demo 李东风中文模板: http://www.math.pku.edu.cn/ ...
- V-Box
Not ) (VERR_NEM_NOT_AVAILABLE). VT-x is disabled in the BIOS for all CPU modes (VERR_VMX_MSR_ALL_VMX ...
- golang channel 的一次内存错误
起因 原因调查 原因分析 问题解决 总结 起因 今天在做数据库数据读取时, 首先通过多个 goroutine 将从数据库读取的数据写入 channel, 同时通过另一个 goroutine 从 cha ...
- dubbo之心跳机制
在网络传输中,怎么确保通道连接的可用性是一个很重要的问题,简单的说,在网络通信中有客户端和服务端,一个负责发送请求,一个负责接收请求,在保证连接有效性的背景下,这两个物体扮演了什么角色,心跳机制能有效 ...
- Windows里面的虚拟机,部署的项目在同一网段也可以访问到
一直想对自己Linux里面部署的项目进行再同一网段进行共享让其他和我同网段的人都看到 今天对于这个问题我终于解决了 首先编辑自己的虚拟机 进行虚拟机网络编辑 选择VMnet8 然后进行下面的NET设置 ...
- deepin开机自动启动服务备忘
systemctl enable mysql.service(设置开机自启) sudo systemctl start nginx.service sudo systemctl restart ngi ...
- 【C语言】【欢哥TV】冒泡法排序视频演示
fromB站 点击进入:Go
- <input type="file">文件上传
<input> type 类型为 file 时使得用户可以选择一个或多个元素以提交表单的方式上传到服务器上,或者通过 Javascript 的 File API 对文件进行操作 . 常用i ...
- [SDOI2013] 直径 - 树形dp
对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. Solution 有点意思 先随便求一条直径(两次DFS即可),不妨设为 \(s,t\),我们知道要求的这些边一定都在这 ...
- linux - mysql 异常:MySQL Daemon failed to start.
报错内容 MySQL Daemon failed to start. 如果直接输入 mysql -root -p 登陆会出现 [mysql]ERROR 2002 (HY000): Can't conn ...