Categories

Tags

Table of Contents

  1. 字符串标准库
    1. 例子
      1. string.sub
  2. 格式化字符串
    1. string.format(pattern,…)
    2. string.gsub(source_s,pattern,replace_s)
    3. strin.match

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