Lua string(字符串)和强大的模式匹配功能

时间:2021-08-07 05:52:50

string(字符串)

字符串由一对双引号或单引号来表示

string1="this is a string1"
string2="this is string2"
print(string1)
print(string2)
Lua string(字符串)和强大的模式匹配功能

也可以用2个方括号"[[]]"来表示“一块”字符串。

html=[[
<html>
<head></head>
<body>
<a href="www.baidu.com">百度一下</a>
</body>
</html>
]]
print(html)
Lua string(字符串)和强大的模式匹配功能

在一个数字字符串上进行算术操作时,Lua会尝试将这个数字字符串转成一个数字:

print("2"+6)
print("2" + "6")
print("2+6")
print("-2e2" * "6")
print("hello"+1)
Lua string(字符串)和强大的模式匹配功能

字符串连接使用的是.. ,如:

print("a" .. "b")
print("123" .. "456")
Lua string(字符串)和强大的模式匹配功能

使用#来计算字符串的长度,放在字符串前面,如下

len="www.baidu.com"
print(#len)
print(#"www.baidu.com")
Lua string(字符串)和强大的模式匹配功能


字符串操作

string.upper(argument) 字符串全部转为大写字母

string.lower(argument) 字符串全部转为小写字母

string.sub(s,i,j)

将从s提取一段字符串,从i到j(闭区间[i,j]),也可以使用负索引值,将从字符串尾部算起,-1是最后一个字符,-2是倒数第二,这么做的好处是当我们要提取直到末尾几个字符时,从后面数其非常方便。

s="[hello,world]"
print(string.sub(s,2,-2))
Lua string(字符串)和强大的模式匹配功能


string.gsub(mainString, findString, replaceString, num)

字符串替换操作,mainString为要替换的字符串,findString为被替换的字符,replaceString要替换的字符,num替换次数(可以忽略则全部替换)

print(string.gsub("aaaa","a","z",3))
Lua string(字符串)和强大的模式匹配功能

string.find(str, substr,[init,[end]])

在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回nil

print(string.find("Hello lua user","lua",1))
print(string.find("Hello lua user","lua"))
Lua string(字符串)和强大的模式匹配功能

string.reverse(arg) 字符串反转

print(string.reverse("lua"))
Lua string(字符串)和强大的模式匹配功能

string.format(...) 返回一个类似print的格式化字符串

print(string.format("the value is:%d",4))
Lua string(字符串)和强大的模式匹配功能

string1="Lua"
string2="Tutorial"
-- 基本字符串格式化
print(string.format("basic format %s %s",string1,string2))
-- 日期格式化
date=9; month=8; year=2016
print(string.format("date format %02d/%02d/%03d",date,month,year))
-- 02d表示2表示宽度,如果整数不够2列就补0,如果大于2,无影响
-- 十进制格式化
print(string.format("%.4f",1/3))
Lua string(字符串)和强大的模式匹配功能

string.char(arg)和string.byte(arg[,int])

char将整型数字转成字符并连接,byte转换字符为整数值(可以指定某个字符,默认第一个字符)。

print(string.char(97,98,99,100))
print(string.byte("ABCD",4))
print(string.byte("ABCD"))

Lua string(字符串)和强大的模式匹配功能


-- 字符转换
-- 转换第一个字符
print(string.byte("Lua"))
-- 转换第三个字符
print(string.byte("Lua",3))
-- 转换末尾第一个字符
print(string.byte("Lua",-1))
-- 第二个字符
print(string.byte("Lua",2))
-- 转换末尾第二个字符
print(string.byte("Lua",-2))

-- 整数ASCII码转换为字符
print(string.char(97))


Lua string(字符串)和强大的模式匹配功能

string.len(arg) 计算字符串长度

print(string.len("abc"))
Lua string(字符串)和强大的模式匹配功能

string.rep(string,n) 返回字符串string的n个拷贝

print(string.rep("abcd",2))
Lua string(字符串)和强大的模式匹配功能

.. 连接两个字符串

print("www.bidu"..".com")
Lua string(字符串)和强大的模式匹配功能

模式匹配

Lua string库里最强大的函数是那些模式匹配函数:find,match,gsub,gmatch。和其他脚本语言不通,Lua既没有用POSIX的正则表达式,也没有用perl的正则表达式。原因是实现这些导致lua占用更多内存,而Lua的初衷是小巧的,嵌入应用的语言。Lua用少于500行的代码实现了自己的一套模式匹配,虽然不如标准的正则表达式强(一般需要4000以上代码),但也足够强大。

string.find将查找目标模板在给定字符串中出现的位置,找到返回起始和结束位置,没找到返回nil。

s="hello,world"
i,j = string.find(s,"hello")
print(string.sub(s,i,j))
Lua string(字符串)和强大的模式匹配功能

string.find还可以给定起始搜索位置,当你想找出所有出现的位置时,这个参数就很有用,例如想知道换行符出现在那些地方:

s="hello\nworld\nnihao\n"
local t={}
local i=0
while true do
i=string.find(s,"\n",i+1)
if i==nil then
break
end
t[#t+1]=i
end

for i,v in ipairs(t) do
print(i.."--"..v)
end
Lua string(字符串)和强大的模式匹配功能

string.match和string.find类似,都市在指定的string中查找相应的模式。不同的是,它返回的是找到的那部分string

print(string.match("hello,world","hello"))
Lua string(字符串)和强大的模式匹配功能

对于可变模式

date="now is 2016/8/9 10:51"
date_m=string.match(date,"%d+/%d+/%d+")
print(date_m)
Lua string(字符串)和强大的模式匹配功能

string.gsub有三个参数,给定字符串,匹配模式和替代字符串。作用就是将所有符合匹配模式的地方都替换成替代字符串。并返回替换后的字符串,以及替换次数。

s,n=string.gsub("Lua is cute","cute","great")
print(s,n)
Lua string(字符串)和强大的模式匹配功能

string.gmatch函数将返回一个迭代器,用于迭代所有出现在给定字符串中的匹配字符。


Lua支持的所有字符类:

       . 任意字符

      %a 字母

      %c 控制字符

      %d 数字

      %l 小写字母

      %p 标点字符

      % s 空白符

      %u 大写字符

      %w 字母和数字

     %x 十六进制数字

     %z 代表0的字符

上面字符类的大写形式表示小写所代表的集合的补集。例如“%A”表示非字母的字符

print(string.gsub("hello,world!","%A","."))
Lua string(字符串)和强大的模式匹配功能

Lua模式匹配中的特殊字符

() % + - * ? [ ^ $

'^'开头表示只匹配目标串的开始部分

如果作用在集合中,补集 [^0-9]表示非数字

'$'结尾表示只匹配目标串的结尾部分

可以使用修饰符来修饰模式增强模式的表达能力,Lua中的模式修饰符有4个:

+ >=1

* >=0

- >=1

? 0次或1词

‘+’匹配一个或多个字符,总是进行最长的匹配。

‘-’匹配一个或多个字符,总是进行最短匹配。

捕获

捕获机制允许一个模式串中的一部分来匹配目标串中的一部分。写法是模式串中你需要捕获的那部分用()括起来。

pair="name = yhk"
key, value=string.match(pair,"(%a+)%s*=%s*(%a+)")
print(key,value)
Lua string(字符串)和强大的模式匹配功能


分隔字符串

s="aA_B_C"
t=string.gmatch(s,"%a+")
print(t)
print(type(t))
a={}
for w in t do
table.insert(a,w)
end

for k,v in pairs(a) do
print(k,v)
end
Lua string(字符串)和强大的模式匹配功能

s="12	aA B C"
a={}
id,sent=string.match(s,"(%d+)\t+(.+)")
print(id)
print(type(id))
print(sent)
print(type(sent))
Lua string(字符串)和强大的模式匹配功能