Lua 字符串
Posted 为啥取个名字这么烦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua 字符串相关的知识,希望对你有一定的参考价值。
--[[ Lua 字符串
字符串或串(String)是由数字、字母、下划线组成的一串字符
Lua语言中字符串可以使用以下三种方式来表示 ]]
-- 单引号的一串字符
-- 双引号的一串字符
-- [[ 与 ]] 之间的一串字符
string1 = "Lua"
print("string1=",string1)
string2 = 'hello'
print("string2=",string2)
string3 = [["Hello World"]]
print("string3=",string3)
-- string1= Lua
-- string2= hello
-- string3= "Hello World"
--[[ 转义字符用于表示不能直接显示的字符,比如后退键,回车键,等。
在字符串转换双引号可以使用 \" 下面是所有转义字符和所对应的意义
转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS),将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下一页开头 012
\n 换行(LF),将当前位置移到下一行开头 010
\r 回车(CR),将当前位置移到本行开头 013
\t 水平制表(HT),(跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一个反斜杠字符 \ 092
\' 代表一个单引号(撇号)字符 039
\" 代表一个双引号字符 034
\0 空字符(NULL) 000
\ddd 1到3位八进制数所代表的任意字符 三位八进制
\xhh 1到2位十六进制所代表的任意字符 二位十六进制
]]
print("\n\n")
-- ***************************************************************************
--[[ 字符串操作
Lua提供了很多的方法来支持字符串的操作
]]
-- string.upper(argument)
-- 字符串全部转换为大写字母
print(string.upper("hello")) -- HELLO
-- string.lower(argument)
-- 字符串全都转换为小写字母
print(string.lower("HellO")) -- hello
-- string.gsub(mainString,findString,replaceString,num)
-- 在字符串中替换
-- mainString为要操作的字符串,findString为被替换的字符串
-- replaceString要替换的字符,num替换次数(可以忽略,则全部替换)
print(string.gsub("HelloWorld","l","#",2)) -- He##oWorld 2
-- string.find(str,substr,[init, [end]])
-- 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体的位置,不存在则返回nil
print(string.find("Hello Lua, Hello World Lua","Lua",2)) -- 7 9
print(string.find("Hello Lua, Hello World Lua","Lua",10)) -- 24 26
-- string.reverse(arg)
-- 字符串反转
print(string.reverse("HelloWorld")) -- dlroWolleH
-- ***************************************************************************
-- string.format(...)
-- 返回一个类似printf的格式化字符串
local st = string.format("the value is:%d",520)
print(st) -- the value is:520
-- 字符串格式化 详细介绍
--[[
Lua提供了string.format()函数来生成具有特定格式的字符串,函数的第一个参数时格式,
之后是对应格式中每个代号的各种数据。由于格式字符串的存在,使得产生的长字符串可读性大大提高了。
格式字符串 转义码
%c 接受一个数字,并将其转换为ASCII码表中对应的字符
%d 接受一个数字并将其转化为有符号的整数格式
%o 接受一个数字并将其转化为八进制数格式
%u 接受一个数字并将其转化为无符号整数格式
%x 接受一个数字并将其转化为十六进制数格式,使用小写字母
%X 接受一个数字并将其转化为十六进制数格式,使用大写字母
%e 接受一个数字并将其转化为科学计数法格式,使用小写字母e
%E 接受一个数字并将其转化为科学计数法格式,使用大写字母E
%f 接受一个数字并将其转化为浮点数格式
%g(%G) 接受一个数字并将其转化为%e(%E,对应%G)及%f中较短的一种格式
%q 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s 接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式,可以在%后添加参数,参数将以如下顺序读入:
(1)符号:一个+符号表示其后的数字转义符将让正数显示正好,默认情况下只有负数显示符号
(2)占位符:一个0,在后面制定了字符串宽度时占位用,不填时默认占位符是空格
(3)对齐标识:在指定了字符串宽度时,默认为右对齐,增加-好可以改变为左对齐
(4)宽度数值
(5)小数位数/字符串裁切:在宽度数值后增加的小数部分n,若后接f(浮点数转义符,如%6.3f)则
设定该浮点数的小数只保留n位,若后接s(字符串转义符,如%5.3s)则设定该字符串值显示前n位
]]
do
local string1 = "Lua"
local string2 = "HelloWorld"
local number1 =10
local number2 = 20
print(string.format("%s %s",string1,string2)) -- Lua HelloWorld
local day = 1
local month =1
local year = 2020
print(string.format("%03d/%02d/%02d",year,month,day)) -- 2020/01/01
print(string.format("%.4f",1/3)) -- 0.3333
print(string.format("%5.3s",string2)) -- Hel 注意,这前面有两个空格
print(string.format("%1.3s",string2)) --Hel
end
print("\n")
do
print(string.format("%c", 83)) -- S
print(string.format("%+d", 17.0)) -- +17
print(string.format("%05d", 17)) -- 00017
print(string.format("%o", 17)) -- 21
print(string.format("%u", 3)) -- 3
print(string.format("%x", 13)) -- d
print(string.format("%X", 13)) -- D
print(string.format("%e", 1000)) -- 1.000000e+03
print(string.format("%E", 1000)) -- 1.000000E+03
print(string.format("%6.3f", 13)) -- 13.000
print(string.format("%q", "One\nTwo") ) -- "One\
-- Two"
print(string.format("%s", "monkey")) -- monkey
print(string.format("%10s", "monkey")) -- monkey
print(string.format("%5.3s", "monkey")) -- mon
end
print("\n\n")
-- ***************************************************************************
-- string.char(arg) 和 string.byte(arg[, int])
-- char将整型数字转成字符并连接,byte转换字符为整数值(可以指定某个字符,默认第一个字符)
-- 字符与整数相互转换
local ss = string.char(65,66,67,68)
print(ss) -- ABCD
local num = string.byte("ABCD",2)
local num2 = string.byte("ABCD")
local num3 = string.byte("ABCD",4)
print("num=",num,"num2=",num2,"num3=",num3) -- num= 66 num2= 65 num3= 68
-- 转换第一个字符
print(string.byte("HelloLua")) -- 72
-- 转换第三个字符
print(string.byte("HelloLua",3)) -- 108
-- 转换末尾第一个字符
print(string.byte("HelloLua",-1)) -- 97
-- 转换第二个字符
print(string.byte("HelloLua",2)) -- 101
-- 转换末尾第二个字符
print(string.byte("HelloLua",-2)) -- 117
-- 整数ASCII码转换为字符
print(string.char(97)) -- a
-- ***************************************************************************
-- string.len(arg)
-- 计算字符串的长度
local str = "Hello"
local strlen = string.len(str)
print("str=",str,"len=",strlen) -- str= Hello len= 5
-- string.rep(string,n)
-- 返回字符串string的n个拷贝
local tmpstr = string.rep("abcd",2)
print(tmpstr) -- abcdabcd
tmpstr = string.rep("HelloWorld ",10)
print(tmpstr)
-- HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld
-- ***************************************************************************
-- ..
-- 连接两个字符串
local he = "hello "
local wo = "world"
local hewo = he .. wo
print(string.format("he=%s wo=%s hewo=%s",he,wo,hewo))
-- he=hello wo=world hewo=hello world
print("\n")
-- ***************************************************************************
-- string.gmatch(str,pattern)
-- 返回一个迭代器函数,每一次调用这个函数,返回一个在字符串str找到的下一个符合pattern描述的字串。
-- 如果参数pattern描述的字符串没有找到,迭代器函数返回nil
for world in string.gmatch("Hello Lua Hello World","%a+") do
print(world)
-- Hello
-- Lua
-- Hello
-- World
end
print("\n\n")
-- ***************************************************************************
-- string.match(str,pattern,init)
-- string.match()只寻找源字符串str中的第一个配对,参数init可选,指定搜寻过程的起点,默认为1
-- 在成功配对时,函数将返回配对表达式中的所有捕获结果,如果没有设置捕获标记,则返回整个配对字符串,当没有成功配对时,返回nil
local match_string = string.match("Sorry! I have 2 questions for you.","%d+ %a+")
print(match_string) -- 2 questions
print("\n")
print(string.format("%d %q", string.match("I have 2 questions for you.", "(%d+) (%a+)")))
-- 2 "questions"
print("\n\n")
-- ***************************************************************************
--[[ 字符串截取
字符串截取使用sub()方法
string.sub()用于截取字符串
string.sub(s, i [, j])
参数说明:
s:要截取的字符串
i:截取开始位置
j:截取结束位置,默认为-1,最后一个字符
来,看看实例
]]
do
local sourcestr = "prefix--brookzhyy--suffix"
print("原始字符串:",string.format("%q",sourcestr))
-- 原始字符串: "prefix--brookzhyy--suffix"
-- 截取部分,从第4个到第10个
local f_sub = string.sub(sourcestr,4,10)
print("截取4-10个字符:",string.format("%q",f_sub))
-- 截取1-10个字符: "fix--br"
-- 截取部分,从第1个到第8个
local s_sub = string.sub(sourcestr,1,8)
print("截取第1-8个字符:",string.format("%q",s_sub))
-- 截取第1-8个字符: "prefix--"
-- 记得取最后10个
local t_sub = string.sub(sourcestr,-10)
print("截取最后10个字符:",string.format("%q",t_sub))
-- 截取最后10个字符: "yy--suffix"
-- 索引越界,输出原始字符串
local f_sub = string.sub(sourcestr,-100)
print("截取 索引越界,返回原是字符:",string.format("%q",f_sub))
-- 截取 索引越界,返回原是字符: "prefix--brookzhyy--suffix"
end
print("\n\n")
-- ***************************************************************************
-- ***************************************************************************
-- 匹配模式
--[[
匹配模式直接用常规的字符串来描述。用于模式匹配的函数:
string.find string.gmatch string.gsub string.match
在模式串中使用字符类
字符类指可以匹配一个特定字符集合内任何字符的模式项。比如:字符类 %d 匹配任何数字,
所以可以使用模式串 %d%d%d%d/%d%d/%d%d 搜索 yyyy/mm/dd格式的日期
不多说,直接上例子
]]
do
local str = "Deadline is 2020/08/25. And that day is Chinese Valentine's Day."
local date = "%d%d%d%d/%d%d/%d%d"
print(string.sub(str,string.find(str,date))) -- 2020/08/25
end
--[[ Lua支持的所有字符类
单个字符(除了 ^$()%.[]*+-?外):与该字符自身配对
.(点) 与任何字符配对
%a 与任意字母配对
%c 与任何控制符配对(\n等)
%d 与任意数字配对
%l 与任意小谢字母配对
%p 与任意标点(punctuation)配对
%s 与空白字符配对
%u 与任意大写字母配对
%w 与任意字母/数字配对
%x 与任意十六进制数配对
%z 与任意代表0的字符配对
%x(此处x是非字母非数字字符):与字符x配对,主要用来处理表达式中有功能多字符(^$()%.[]*+-?)的配对问题
例如:%% 与 % 配对
[数个字符类]:与任何[]中包含的字符类配对,例如:[%w_]与任何字母/数字,或下划线符号_配对
[^数个字符类]:与任何不包含在[]中的字符类配对,例如:[^%s]与任何非空白字符配对
当上述的字符类用大些书写时,表示与非此字符的任何字符配对,如,%S表示与任何非空白字符配对,例如 %A 与非字母的字符配对
]]
print(string.gsub("hello, up-down!", "%A","."))
-- hello..up.down. 4
-- 解释下: %A 配对任何非字母字符,因此,配对到了 , -! 四个,然后把它们替换为.
-- 数字4不是字符串的一部分,它是gsub返回的第二个结果,代表发生替换的次数
-- 在模式匹配中有一些特殊字符,它们有特殊的意义,Lua中的特殊字符如下
-- ( ) . % + - * ? [ ^ $
-- % 用作特舒符号的转义字符,因此 %. 匹配点. %% 匹配字符百分号%
-- 转义字符%不仅可以用来转义特殊字符,还可以用于所有的非字母的字符
--[[ 模式条目可以是
单个字符类匹配该类别中的任意单个字符
单个字符类跟一个*,将匹配零个或多个该类的字符,这个条目总是匹配尽可能长的串
单个字符类跟一个+,将匹配一个或多个该类的字符,这个条目总是匹配尽可能长的串
单个字符类跟一个-,将匹配零个或多个该类的字符,和*不同,这个条目总是匹配尽可能短的串
单个字符类跟一个?,将匹配零个或一个该类的字符,只要有可能,他会匹配一个
%n,这里的n可以从1到9,这个条目匹配一个等于n号捕获物(后面有描述)的字串
%bxy,这里的x和y是两个明确的字符:这个条目匹配以x开始y结束,且其中x和y保持平衡的字符串,
意思是,如果从左到右读这个字符串,对每次读到一个x就+1,读到一个y就-1,最终结束处的那个y是第一个读到0的y。
举个例子:条目%b()可以匹配到括号品哼到表达式
%f[set],指边境模式,这个条目会匹配到一个位于set内某个字符之前到一个空串,且这个位置和前一个字符不属于set。
集合set到含义如前面所描述,匹配出的那个空串之开始和结束点点计算就看成该处有个字符\0一样。
模式:
模式,指一个模式条目序列。在模式最前面加上符号^将锚定从字符串的开始处做匹配。
在模式最后面加上符号$将使匹配过程锚定到字符串的结尾。如果^和$同时出现在其他位置,它们均没有特殊含义,只表示自身。
捕获:
模式可以在内部用小括号括起一个子模式:这些子模式被称为 捕获物。当匹配成功时,由 捕获物匹配到的字符串的字串被保存起来用于未来的用途,
捕获物以它们左括号的次序来编号。例如,对于模式 (a*(.)%w(%s*)) 字符串中匹配到 a*(.)%w(%s) 的部分保存在第一个捕获物中(因此编号是1)
由 . 匹配到的字符是2好捕获物,匹配到 %s* 的那部分是3号
作为一个特例,空的捕获()将捕获到当前字符串的位置(它是一个数字)。
例如:如果将模式 ()aa() 作用到字符串 flaaap上,将产生两个捕获物:3和5
]]
扫码关注一下呗~
以上是关于Lua 字符串的主要内容,如果未能解决你的问题,请参考以下文章