Lua学习记录 — (5)字符串

String.lua

------------------------------------ Lua字符串表示方式 ------------------------------------

-- 单引号
str = 'hello'

-- 双引号
str = "hello"

-- [[]]
str = [[
hello
baby
]]

------------------------------------ 转义字符 ------------------------------------

--[=[
\a响铃   \b退格    \f换页    \n换行    \r回车    \t水平制表符(下一个TAB位置)
\v水平制表符     \\代表一个反斜线字符     \'代表单引号字符   \"代表双引号字符   \0空字符(null)
\ddd十进制数代表的字符(\010表示换行)     \xhh十六进制数表示的字符(\x0a表示换行:Lua5.3)
]=]

------------------------------------ 字符串操作(string库) ------------------------------------

---- byte(s[,i[,j]]) :获取字符串的内部数字编码
str = "abcde"
print(string.byte(str,2,4))                                               --> 98 99 100

---- char(...) :将数字编码转化为字符串
print(string.char(97,98,99,100,101))                                        --> abcde
print(string.char(228,189,160,229,165,189))                                 --> 你好

---- dump(function,[,strip]) :将函数转换成二进制码
function dumpTest()
    print("dump测试")
end
a = string.dump(dumpTest)
print(a)                                                                        --> LuaQ
b = loadstring(a)   -- 加载一段字符串代码,即把字符串转换成代码
print(b)                                                                        --> function: 00ADBED0
print(dumpTest)                                                                 --> function: 00ADBE50(注意:并不是指向同一个函数,因此地址不同)
b()                                                                             --> dump测试

---- fing(s,pattern[,init[,plain]]) :从目标字符串中搜索指定的内容,并返回位置
-- 不存在则返回nil
numStart,numEnd = string.find("lua python lua python","lua")
print(numStart,numEnd)                                                          --> 1 3
numStart,numEnd = string.find("lua python lua python","lua",3)
print(numStart,numEnd)                                                          --> 12 14

---- fomat(formatstring,...) :格式化字符串
str = "%d is a number"
num = 100
Fomatstr = string.format(str,num)
print(Fomatstr)                                                                 --> 100 is number
-- q选项:将字符串用双引号括起来
Fomatstr = string.format("%q","100 is a 'number'")
print(Fomatstr)                                                                 --> "100 is 'number'"

---- gsub(s,pattern,repl[,n]) :获取字符串迭代器
-- 每次调用会继续以pattern对s做匹配,并返回所有捕获到的值;
-- 如果pattern中没有指定捕获,则每次捕获整个pattern;
str = "python lua c cpp csharp"
for word in string.gmatch(str,"%a+")do
    print(word)                                                                 --> python/lua/c/cpp/csharp
end
str = "key1:lua, key2:python, key3:c, key4:cpp"
tbl = {}
for k,v in string.gmatch(str,"(%w+):(%w+)")do
    tbl[k]=v
end
print(string.format("k = %s , v = %s",'key2',tbl.key2))         --> k = key2 , v = python
print(string.format("k = %s , v = %s",'key4',tbl['key4']))      --> k = key4 , v = cpp

---- gsub(s,pattern,repl[,n]) :将字符串中所有指定的字符子串替换成指定字符串,并返回其副本
-- repl可以是字符串、表、或函数;(返回的数字,为发生替换的次数)
-- 如果repl是字符串,则把这个字符串作为替代品;
str = "lua c c c"
rlt,num = string.gsub(str,"c","lua")    -- 不加n参数,表示全部替换
print(rlt,num)                                                                      --> lua lua lua lua 3
rlt,num = string.gsub(str,"c","python",2) -- n=2,表示只替换前2个
print(rlt,num)                                                                      --> lua python python c 2
--repl中的所有形式为%d的串,表示第d个捕获到的字符子串(d可以是1到9),%0表示整个匹配
rlt = string.gsub("lua python c csharp","(%w+)","%1 %1")
print(rlt)                                                                            --> lua lua python python c c csharp csharp
rlt = string.gsub("lua python c csharp","%w+","%1 %1",1)  -- n=1表示只替换1次
print(rlt)                                                                            --> lua lua python c csharp
rlt = string.gsub("lua python c csharp","(%w+)%s*(%w+)","%2 %1")
print(rlt)                                                                            --> python lua csharp c
rlt = string.gsub("lua python c csharp","(%w+)%s*(%w+)","%0 %2 %1",1)
print(rlt)                                                                            --> lua python python lua c csharp

-- 如果repl是函数,则在每次匹配发生时,都会调用这个函数;所有捕获到的子串一次作为参数传入;
str = "4+5 = $return 4+5$; 8-20 = $return 8-20$;"
rlt = string.gsub(str,"%$(.-)%$",function (s)
    return loadstring(s)()
end)
print(rlt)                                                                            --> 4+5 = 9; 8-20 = -12;

-- 如果repl是表,每次匹配时,都会用第一个捕获物作为键去查这张表;
tbl = {language = "lua",version = "5.1"}
rlt = string.gsub("$language-$version.tar.gz","%$(%w+)",tbl)               --> lua-5.1.tar.gz
print(rlt)

---- 获取字符串长度 len(s)
str = "lua python"
len = string.len(str)
print(len)                                                                            --> 10
print(string.len(""))                                                              --> 0

---- 大写字母转小写字母 lower(s)
str = "LUA PYTHON27"
print(string.lower(str))                                                              --> lua python27

---- 从字符串中找到一个指定的子字符串,并返回 match(s,pattern[,init])
-- 找不到则返回nil
str = "lua  123 python"
print(string.match(str,"%d+ %w+"))                                            --> 123 python

---- 返回字符串的n个拷贝 rep(s,n)
print(string.rep("hello",2))                                                    --> hellohello

---- 翻转字符串 reverse(s)
print(string.reverse("abcde"))                                                     --> edcba

---- 返回某个位置范围内的字符子串 sub(s,i,j)
print(string.sub("abc def ghi jkl",2,6))                                      --> bc def

---- 小写字母转大写字母 upper(s)
print(string.upper("hello"))                                                       --> HELLO


------------------------------------ 字符串格式化 ------------------------------------

-- %c 接收数字,转化为ASCII码对应的字符
print(string.format(" %c",101))                                       --> e
-- %d %i 接收数字,转化为有符号的整数格式
print(string.format("%d %i",33.33,-33.33))                            --> 33 -33
-- %u 接收数字,转化为无符号的整数格式
print(string.format("%u",-33.33))                                     --> 4294967263
-- %e %E 接收数字,转化为科学计数法格式
print(string.format("%e %E",-33.33,-33.33))                           --> -3.333000e+001 -3.333000E+001
-- %f 接收数字,转化为浮点数格式
print(string.format("%f",-33.33))                                     --> -33.330000
-- %g %G 接收一个数字,转化为%e(%E,对应%G)及%f中较短的一种格式
print(string.format("%g",-33.33))                                     --> -33.33
print(string.format("%g %G",-3333333.33,-3333333.33))                 --> -3.33333e+006 -3.33333E+006
-- %s 接收一个字符串
print(string.format("%s",tostring(-3333.3333)))                       --> -3333.3333
-- %o 接收一个数字,转化为八进制格式
print(string.format("%o",20))                                         --> 24
-- %x %X 接收一个数字,转化为十六进制格式
print(string.format("%x %X",30,30))                                   --> 1e 1E

---- 细化格式
-- 符号:加一个+号,将让正数显示正号
print(string.format("%+f",33.33))                                     --> +33.330000
-- 占位符+宽度数值:(在宽度前加0,则用0占位,否则默认用空格)
print(string.format("%10s","hello"))                                  -->      hello
print(string.format("%010s","hello"))                                 --> 00000hello
print(string.format("%10g",33.3))                                     -->       33.3
print(string.format("%010d",33.3))                                    --> 0000000033
print(string.format("%010f",33.3))                                    --> 033.300000
-- 对齐标识:在指定了占位宽度时,加-号可以改为左对齐
print(string.format("%-10s|","hello"))                                --> hello     |
print(string.format("%-010s|","hello"))                               --> hello     |
print(string.format("%-10g|",33.3))                                   --> 33.3      |
print(string.format("%-010d|",33.3))                                  --> 33        |
print(string.format("%-010f|",33.3))                                  --> 33.300000 |
-- 小数位数/字符串裁切:
print(string.format("%.5s","abcdefghijk"))                            --> abcde
print(string.format("%8.5s","abcdef"))                                -->    abcde
print(string.format("%.5f",33.12345678))                              --> 33.12346
print(string.format("%010.5f",33.33333))                              --> 0033.33333
print(string.format("%10.5g",33.33333))                               -->     33.333

------------------------------------ 字符串匹配模式 ------------------------------------

---- 用于模式匹配函数 string.fing\gmatch\gsub\match(以下注解输出的'/'表示下一行)
str = "abc123ABC\n0 ;"
-- 单个字符x(x不能是魔法字符^$()%.[]*+-?其中之一)
rlt = string.gsub(str,"c","v")
print(rlt)                                                                            --> abv123ABC/0 ;
-- 点.:任何字符
rlt = string.gsub(str,".","v")
print(rlt)                                                                            --> vvvvvvvvvvvvv
-- %a:任何字母(alphabet)
rlt = string.gsub(str,"%a","v")
print(rlt)                                                                            --> vvv123vvv/0 ;
-- %c:任何控制字符(control)
rlt = string.gsub(str,"%c","v")
print(rlt)                                                                            --> abc123ABCv0 ;
-- %d:任何数字(digit)
rlt = string.gsub(str,"%d","v")
print(rlt)                                                                            --> abcvvvABC/v ;
-- %l:小写字母(low)
rlt = string.gsub(str,"%l","v")
print(rlt)                                                                            --> vvv123ABC/0 ;
-- %p:任何标点符号(punctuation)
rlt = string.gsub(str,"%p","v")
print(rlt)                                                                            --> abc123ABC/0 v
-- %s:任何空白字符(space)不只是空格
rlt = string.gsub(str,"%s","v")
print(rlt)                                                                            --> abc123ABCv0v;
-- %u:大写字母(up)
rlt = string.gsub(str,"%u","v")
print(rlt)                                                                            --> abc123vvv/0 ;
-- %w:字母及数字(word)
rlt = string.gsub(str,"%w","v")
print(rlt)                                                                            --> vvvvvvvvv/v ;
-- %x:16进制(这里只有abcdefABCDEF字母属于16进制)
rlt = string.gsub(str,"%x+","v")
print(rlt)                                                                            --> v/v ;(abc123ABC与0都算是16进制)
-- %x:特殊字符x(例如功能字符().%+-*?[]^$)
rlt = string.gsub("().%+-*?[]^$","%%","V")
print(rlt)                                                                            --> ().V+-*?[]^$
rlt = string.gsub("().%+-*?[]^$","%(","V")
print(rlt)                                                                            --> V).%+-*?[]^$
-- [set]集合:所有字符的联合;(使用'-'连接的表示升序范围)
rlt = string.gsub("().%+-*?[]^$","[%.%+%?%$]","V")
print(rlt)                                                                            --> ()V%V-*V[]^V
rlt = string.gsub(str,"[a-d]","V")
print(rlt)                                                                            --> VVV123ABC/0 ;
rlt = string.gsub("hello LUA! i am lua5.1!","[a-d]%l+","V")
print(rlt)                                                                            --> hello LUA! i V lua5.1!(a属于集合[a-d],m属于%l)
rlt = string.gsub("a123 asd 5aa bbaa8 bbtaa8!","[a-d]+%d+","V")
print(rlt)                                                                            --> V asd 5aa V bbtV!
-- [^set]:set的补集
rlt = string.gsub("abCdEFgH,;g","[^%l]","V")
print(rlt)                                                                            --> abVdVVgVVVg

---- 模式条目
-- +:重复1次或多次(匹配尽可能长的串)
rlt = string.gsub("/#abc#/ /##/ /# #/ /#a#/ /#abc#/","/#%l+#/","$")
print(rlt)                                                                            --> $ /##/ /# #/ $ $
-- *:重复0次或多次(匹配尽可能长的串)
rlt = string.gsub("/#abc#/ /##/ /# #/ /#a#/ /#abc#/","/#%l*#/","$")
print(rlt)                                                                            --> $ $ /# #/ $ $
-- -:重复0次或多次(匹配尽可能短的串)
rlt = string.gsub("/#abc#/ /##/ /# #/ /#a#/ /#abc#/","/#.-#/","$")
print(rlt)                                                                            --> $ $ $ $ $
rlt = string.gsub("/#abc#/ /##/ /# #/ /#a#/ /#abc#/","/#.+#/","$")
print(rlt)                                                                            --> $
-- ?:重复0次或1次(匹配尽可能短的串)
rlt = string.gsub("/#abc#/ /##/ /# #/ /#a#/ /#abc#/","/#.?#/","$")
print(rlt)                                                                            --> /#abc#/ $ $ $ /#abc#/

-- %n:n可以是0到9,匹配第n号捕获物;
rlt = string.gsub("$name = abc; $age = 0","(%$%l+) = (%w+)","%2 %1")
print(rlt)                                                                            --> abc $name; 0 $age
rlt = string.gsub("$name = abc; $age = 0","(%$%l+ = %w+).+(%$%l+ = %w+)","%2 ; %1")
print(rlt)                                                                            --> $age = 0 ; $name = abc

-- %bxy:从x开始到y结束的保持平衡的字符串;
rlt = string.gsub("f(x) = ((a+b)*5 - c)/d","%b()","$")
print(rlt)                                                                            --> f$ = $/d

---- 模式:
-- 指一个模式条目的序列;
-- 在模式最前面添加^,将锚定从字符串的开始处做匹配;
-- 在模式最后面添加$,将锚定从字符串的结束处做匹配;

---- 捕获:
-- 模式可以在内部用小括号括起一个子模式,这些子模式被称为 捕获物;
-- 以左括号的出现顺序来确定次序编号;如 (a*(.)%w(%s)),顺序分别是:1号 a*(.)%w(%s)  2号 .   3号 %s

------------------------------------ 字符串运算符 ------------------------------------

---- 字符串连接符号:..
print("abc" .. "123")                                                             --> abc123

---- 字符串长度获取符号:#(其实也可以用于list)
print(#"asd123")                                                                  --> 6

---- 数字字符串的运算(算数运算符基本都可以使用)
print("12"+"13")                                                                  --> 25
print("12"+13)                                                                    --> 25
print("12"%"5")                                                                   --> 2

--[=[       《补充》
字符串库在初始化的时候,为字符串类型设置了元表;
]=]

str = "abcdefg"
print(str:len())                                                                     --> 7
str = "%g is a numbers!"
print(str:format(55.55))                                                             --> 55.55 is a numbers!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值