Table of Contents
Lua中的字符串是不可变的,当尝试使用字符串标准库中的函数对字符串做修改时,时返回一个新的字符串,不会影响到原来的字符串
字符串标准库
调用 | 描述 | 输入 | 输出 |
---|---|---|---|
string.len(s) | 获取字符串s的长度,等价于#s | “abc def” | 7 |
string.rep(s,n) | 将s重复n次 | “abc”,3 | abcabcabc |
string.reverse(s) | 返回反转字符串 | “abc” | “cba” |
string.lower(s) | 返回s的全部字母变成小写后字符串 | “Hello World” | “hello world” |
string.upper(s) | 返回s的全部字母变成大写后字符串 | “Hello World” | “HELLO WORLD” |
string.sub(s,i,j) | 提取字符串s中i到j的部分 | “Hello World”,1,5 | “Hello” |
string.char(…) | 返回多个整型数值分别转成对应的字符 | 100,101,102 | c d e |
string.byte(s,i) | 返回字符串s中的第i个字符的数值,i不填写时默认为1 | “abc”,1 | 97 |
string.byte(s,i,j) | 返回字符串s中的i 到 j之间的字符的数值 | “abc”,1,3 | 97,98,99 |
string.find(source_s,target_s) | 在source_s中查找复合target_s的起始位置和结束位置 | “this is yimi”,”is” | 3,4 |
string.gsub(source_s,pattern,replace_s) | |||
string.find(s,pattern) | 返回字符串s中复合指定格式的子字符串 |
例子
string.sub
string.sub 支持负索引,负索引表示从尾部开始计数
s = "[hello world]"
string.sub(s,2,-2) --> hello world
string.sub(s,1,1) --> [
string.sub(s,-1,-1) --> ]
格式化字符串
string.format(pattern,…)
符号 | |
---|---|
d | 十进制 |
x | 十六进制 |
f | 浮点数 |
s | 字符串 |
string.format("x = %d , y = %d",10,20) -- => x = 10 , y = 20
string.format("x = %x",200) -- => x = c8
string.format("x = 0x%X",200) -- => x = 0xC8
string.format("x = %f",200) -- => x = 200.0000
tag,title = "h1", "a title"
string.format("<%s>%s</%s>",tag,title,tag) -- =><h1>a title</h1>
限定浮点数的小数位数,%2d
至少由两个十进制数组成,不足时用空格补齐,而%02d
则表示不足时用0补齐
string.format("pi = %.4f",math.pi) -- => pi = 3.1416
d = 9;m = 11; y = 2019
String.format("%02d/%02d%04d",d,m,y) -- => 09/11/2019
string.gsub(source_s,pattern,replace_s)
pattern 是模板样式,表示我们要获取的字符串需要符合哪些规则
对于特殊符号,如().%+_*?[^$]
这些,只需要在它们前面加上%就好
符号 | |
---|---|
c | 控制符 |
a | 字母 |
l | 小写字母 |
u | 大写字母 |
d | 数字 |
s | 空格 |
w | 字母与数字 |
x | 十六进制数 |
z | 用0表示的字符 |
. | 任意字符 |
修饰符 | |
---|---|
+ | 重复一次或多次 |
* | 重复零次或多次 |
- | 重复零次或多次(最小匹配) |
? | 可选(重复零次或一次) |
mydata = "yimi's phone is 123-456789"
newdata = string.gsub(mydata,"%d","*")
print(newdata) -- => "yimi's phone is ***-******"
data2 = "(758)555-1234"
data2 = string.gsub(data2,"%(%d%d%d%)","(233)")
print(data2) -- =>(233)555-1234
-- 打印输出所有花括号之间的字符串
string.gsub("The big {brown} fox jumped {over} the lazy {dog}.","{(.-)}", function(a) print(a) end )
-- function(a) print(a) end 表示对所有匹配到的值进行的操作,是个匿名委托函数
a = "sda(abc,efg)"
sub = string.match(a,"%((%a+,%a+)%)")
print(sub) --=> abc,efg
strin.match
a = "sda[123456]"
sub = string.match(a,"%[%d+%]")
print(sub)
mydata = "today is 24/11/2019"
d,m,y = string.match(mydata,"(%d+)/(%d+)/(%d+)")
print(d,m,y) -- => 24 11 2019
-- 把函数定义分离为函数名和参数列表
function splitFunc(_function)
local name, s = string.match( _function,"(.*)%((.*)%)")
print(name,s)
end
local fun = "Transport(t,f,m,c)"
splitFunc(fun)
使用比较多的场景
- 获取路径中的某一部分,如文件名,文件扩展名
mydata = "C://sasda/fasf/test.lua"
res = string.match(mydata,"%a+%.%a+")
print(res) -- => test.lua
--======== 将结果分离返回
a,b = string.match(mydata,"(%a+)%.(%a+)")
print(a,b) -- => test lua