1、获取字符串长度
--获取字符串长度
s='abcd'
d="杭州"
--一个汉字占3个长度
--一个英文字符占1个长度
print(#s)
print(#d)
2、转义字符
--lua支持转义字符
--实现多行打印
print('小妹妹\n好漂亮')
实现多行打印还可以使用
s=[[
我们是
穿梭在
银河
的
火箭队
喵
]]
print(s)
3、字符串拼接
1、第一种
不管啥类型用都可以拼在一起
--字符串拼接通过..
s1 = 123
s2 = '666'
print(s1..s2)
2、第二种
采用转义字符来拼接
%d:与数字拼接
print(string.format('老铁%d',666))
%s:与字符配对
详细的可以看看https://www.runoob.com/lua/lua-strings.html
4、字符串转换
当然,如果我们单纯打印的话,没必要用到tostring(),这是用在我们编程的还时候需要显式转换的时候
5、Lua 常用支持字符串的操作
str="abCdeFG"
str2 = "长zh1"
--大写转小写
print(string.lower(str)) -------abcdefg
--小写转大写
print(string.upper(str)) -------ABCDEFG
--翻转字符串
print(string.reverse(str)) ----------GFedCba
--字符串索引(返回两个值,一个是起始位置,一个是结束位置(你看我找一个它也是返回3,3))
print(string.find(str,"Cd")) --------3 4
print(string.find(str,'C')) --------3 3
--截取字符串(它这边有个重载,如果只传入一个数值的话,默认输出这这个数值到结尾的字符串。如果两个数值,取这个两个数值的中间字符串)
print(string.sub(str,3)) --------CdeFG
print(string.sub(str,3,5)) -------Cde
print(string.sub(str2,3)) -----如果含有中文字符就不能使用sub进行截取,否则会产生乱码
--字符串修改
print(string.rep(str,2)) -------abCdeFGabCdeFG
--字符串修改
print(string.gsub(str,"Cd",'WW')) -------abWWeFG 1
--返回字符串的内部数字编码ascii码
--string.byte (s [, i [, j]]) 中括号代表可选的参数 可以这样调用:string.byte("abc"),也可以这样调用:string.byte("abc",1),当然也可以这样调用:string.byte ("abc",1,-1);)
--返回字符串的内部数字编码,i、j为字符串的索引,i、j限定了多少字符就返回多少值。
local k1 = string.byte(str)
print(k1) -----97
local k2 = string.byte(str,1)
print(k2) -----97
local k3 = string.byte(str,2)
print(k3) -----98
local k4,k5,k6= string.byte(str,1,3)
print(k4,k5,k6) ----97 98 67
--string.char (···)
--跟byte()相反,把数字编码转换为字符串
s = string.char(97,98,99)
print(s) --abc
n = string.char()
print(n) --什么都没输出
print(type(n)) --string
print(string.byte("hello",1,-1)) -- 104 101 108 108 111
print(string.char(string.byte("hello",1,-1))) --hello
--string.dump (function [, strip])
-- 这个函数是用来序列化函数的。传入一个函数,返回一个字符串。通过load该字符串可以反序列化该函数。
--序列化
--序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
function max( a,b )
return a>b and a or b
end
--将函数序列化
local func_content = string.dump(max)
print(func_content)
print(type(func_content)) --string
--string.format (formatstring, ···)
--这个函数用来格式化字符串。API文档很复杂,用法很多
--我们知道lua中可以用".."连接字符串,可以起到一部分格式化字符串的作用
--但是如果字符串较长或者有特殊的格式转换操作(如十六进制转换),用".."就会很繁琐且可读性差。用string.format()就是一个很好的解决方案。
--
格式控制符以%开头,常用的有以下几种
-- %a: 表示任何字母。
-- %c: 表示任何控制字符。
-- %d: 表示任何数字。
-- %g: 表示任何除空白符外的可打印字符。
-- %l: 表示所有小写字母。
-- %p: 表示所有标点符号。
-- %s: 表示所有空白字符。
-- %u: 表示所有大写字母。
-- %w: 表示所有字母及数字。
-- %x: 表示所有 16 进制数字符号。
-- (这里的 x 是任意非字母或数字的字符) 表示字符 x。 这是对魔法字符转义的标准方法。 所有非字母或数字的字符 (包括所有标点,也包括非魔法字符) 都可以用前置一个 '%' 放在模式串中表示自身。
print(string.format("屠龙大宝刀%d级", 5)) --屠龙大宝刀5级
print(string.format("屠龙大宝刀%s级", "五")) --屠龙大宝刀五级
print(string.format("浮点型%f", 3.14)) --浮点型3.140000
--string.gmatch (s, pattern)
--这个函数基本就是用来配合for循环使用的,返回一个迭代器函数,每次调用这个迭代器函数都会返回一个匹配该字符串的值。
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w) --连续输出每个单词
end
--string.gsub (s, pattern, repl [, n])
--这个函数用来进行字符替换的。将每个匹配的字符串替换成指定的字符串repl。返回替换完毕的字符串和替换的次数。个人觉得这个函数非常有意思。
--若repl为函数则会用匹配到的参数作为参数调用这个函数,若repl为table,则会用匹配到的参数作为键去查找这个表。
--字符串
print(string.gsub("i have an apple", "apple", "peach"))
--函数
function ff( arg )
print("function arg : " .. arg)
end
print(string.gsub("my name is qsk", "%a+", ff))
--table
t = {}
metat = {}
metat.__index = function ( table,key )
return "!!" .. key
end
setmetatable(t, metat)
print(string.gsub("my name is qsk", "%a+", t))
-- string.len (s)
-- 求字符串的长度
local str3 = "埃尔法" -- 中文占3个字符
print(string.len(str3))
local str4 = "AS"
local str5 = "123"
print(string.len(str4),string.len(str5)) -- 英文和数字占1个字符