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]])-- 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体的位置,不存在则返回nilprint(string.find("Hello Lua, Hello World Lua","Lua",2)) -- 7 9print(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)) --Helendprint("\n")doprint(string.format("%c", 83)) -- Sprint(string.format("%+d", 17.0)) -- +17print(string.format("%05d", 17)) -- 00017print(string.format("%o", 17)) -- 21print(string.format("%u", 3)) -- 3print(string.format("%x", 13)) -- dprint(string.format("%X", 13)) -- Dprint(string.format("%e", 1000)) -- 1.000000e+03print(string.format("%E", 1000)) -- 1.000000E+03print(string.format("%6.3f", 13)) -- 13.000print(string.format("%q", "One\nTwo") ) -- "One\ -- Two"print(string.format("%s", "monkey")) -- monkeyprint(string.format("%10s", "monkey")) -- monkeyprint(string.format("%5.3s", "monkey")) -- monendprint("\n\n")-- ***************************************************************************
-- string.char(arg) 和 string.byte(arg[, int])-- char将整型数字转成字符并连接,byte转换字符为整数值(可以指定某个字符,默认第一个字符)-- 字符与整数相互转换local ss = string.char(65,66,67,68)print(ss) -- ABCDlocal 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) -- abcdabcdtmpstr = 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 .. woprint(string.format("he=%s wo=%s hewo=%s",he,wo,hewo))-- he=hello wo=world hewo=hello worldprint("\n")-- ***************************************************************************-- string.gmatch(str,pattern)-- 返回一个迭代器函数,每一次调用这个函数,返回一个在字符串str找到的下一个符合pattern描述的字串。-- 如果参数pattern描述的字符串没有找到,迭代器函数返回nilfor world in string.gmatch("Hello Lua Hello World","%a+") do print(world)-- Hello-- Lua-- Hello-- Worldendprint("\n\n")-- ***************************************************************************-- string.match(str,pattern,init)-- string.match()只寻找源字符串str中的第一个配对,参数init可选,指定搜寻过程的起点,默认为1-- 在成功配对时,函数将返回配对表达式中的所有捕获结果,如果没有设置捕获标记,则返回整个配对字符串,当没有成功配对时,返回nillocal match_string = string.match("Sorry! I have 2 questions for you.","%d+ %a+")print(match_string) -- 2 questionsprint("\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"endprint("\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/25end--[[ 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可以从19,这个条目匹配一个等于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上,将产生两个捕获物:35]]

扫码关注一下呗~

以上是关于Lua 字符串的主要内容,如果未能解决你的问题,请参考以下文章

lua错误:尝试调用nil值(字段'getn')

lua脚本中怎么对比字符串

lua里面如何require一串lua格式的字符串

lua怎么判断字符串中含有汉字

lua中判断首字符为空

检查 Lua 中的字符串是不是为 nil 或为空