Lua学习之基础篇三Lua字符串操作
Lua字符串可以使⽤以下三种⽅式表⽰:
单引号间的⼀串字符。
双引号间的⼀串字符。
[[和]]间的⼀串字符。
string = [["Lua"]]
print("字符串是",string)
--字符串是 "Lua"
Lua 提供很多内建⽅法⽀持字符串的操作:
1. string.upper(argument):
-->字符串全部转为⼤写字母
2. string.lower(argument):
-->字符串全部转为⼤写字母
3. string.gsub(mainString,findString,replaceString,num)
-->在字符串中替换,mainString为要替换的字符串,findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),返回的值是value+替换的length,如:
string.gsub("aaaa","a","b",3);
--bbba    3
PS: gsub有⼀个重要的功能就是透过模式匹配过滤或者返回你想去除的字串,模式介绍参考下⾯拓展部分
--实例1  对字符串中的每⼀个字母进⾏复制,并⽤连字符将复制的字母和原字母连接
p,_= string.gsub("hello Lua!", "(%a)", "%1-%1")
print(p)
--h-he-el-ll-lo-o L-Lu-ua-a!
--实例2 互换相邻的字符
p,_=string.gsub("hello Lua", "(.)(.)", "%2%1")
print(p)
--ehll ouLa
--替换掉字符⾥的字母a和尖括号
local text = string.gsub(text, '[a<>]', '')
--替换掉特殊的符号
local text = string.gsub(text, "%[", "")
local text = string.gsub(text, "%]", "")
--也可以这样
local text = string.gsub(text, "[%[%]]", "")
4. string.find (s, pattern [, init [, plain]])**
-->在⼀个指定的⽬标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置,不存在则返回 nil,其中init 代表起始位置。
print(string.find("test", 'es'))
----输出 2  3
如果我们只想要 string.find 返回的第⼆个值,可以使⽤虚变量(即下划线)
_, q=string.find("test", 'es')
print(q)  ---- 输出 3
如果我们只想要 string.find 返回的第1个值,下划线代表当前return 变量,对find进⾏赋值再打印即可
q,_ = string.find("test", 'es')
print(q)  ----输出2
拓展-->字符串模式匹配
pair = "name = Anna"
_, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
print(key, value)
-- 输出 name Anna
如果 find 的第⼆个参数使⽤了某种匹配模式,并且模式串⾥⾯带括号。那么表⽰会“捕捉”括号括起来的模式匹配到的字符串。捕捉,当然会把他们作为返回值。这⾥捕捉了两下,所以 find 返回了两个值
Lua⽀持的字符类有:
. 任意字符
%s 空⽩符
%p 标点
%c 控制字符
%d 数字
%x ⼗六进制数
%z 代表0的字符
%a 字母
%l ⼩写字母
%u ⼤写字母
%w 字母数字
字符类的⼤写形式代表相应集合的补集,⽐如:%A 表⽰除了字母以外的字符集
另外还有模式修饰符,* + - 三个,作为通配符分别表⽰:
*:匹配前⾯指定的 0 或多个同类字符,尽可能匹配更长的符合条件的字串
--先尽可能长的把本次匹配模式⾛完,再继续⼀下⼀个模式
+:匹配前⾯指定的 1 或多个同类字符,尽可能匹配更长的符合条件的字串
--匹配前⼀字符1次或者多次
-:匹配前⾯指定的 0 或多个同类字符,尽可能匹配更短的符合条件的字串
--本次匹配模式每⾛⼀步,就确认⼀下⼀个模式能否进⼊
匹配前⼀字符0次或1次
^ 匹配字符串开头
$ 匹配字符串结尾
模式串中的特殊字符
( ) . % + - * ? [ ^ $
'%' ⽤作特殊字符的转义字符
'%.' 匹配点;
lua字符串转数组
'%%' 匹配字符 '%'。
转义字符 '%'不仅可以⽤来转义特殊字符,还可以⽤于所有的⾮字母的字符。当对⼀个字符有疑问的时候,为安全起见请使⽤转义字符转义他。
⽤'[]'创建字符集
'[%w_]' 匹配字母数字和下划线
'[01]' 匹配⼆进制数字
'[%[%]]'匹配⼀对⽅括号
在'[]'中使⽤连字符'-'
'%d' 表⽰ '[0-9]';
'%x' 表⽰ '[0-9a-fA-F]'
'[0-7]' 表⽰ '[01234567]'
在'[]'开始处使⽤ '^' 表⽰其补集:
'[0-7]' 匹配任何不是⼋进制数字的字符;
'[^\n]' 匹配任何⾮换⾏符户的字符。
'[^%s]' == '%S'
于是, "(%a+)%s=%s(%a+)" 表⽰,先匹配⼀个或多个字母,然后是零个或多个空⽩符(⽐如空格),然后是个'=',然后空⽩符,然后字母。这样,满⾜匹配的只有"name = Anna"。所以输出位置为 2 12.
因为捕获了两个 (%a+),也就是 name, Anna 这两个单词,所以还输出了这两个单词
另外, lua 使⽤ %1-%9 表⽰拷贝捕获。
捕获是这样⼀种机制:可以使⽤模式串的⼀部分匹配⽬标串的⼀部分。将你想捕获的模式⽤圆括号括起来,就指定了⼀个捕获
s="abc \"it's a cat\""
_,_,_,q=string.find(s, "([\"'])(.-)%1")
print(q)  -----输出: it's a cat
⾸先, ["'] 表⽰匹配双引号或者单引号,因为有括号,所以引号被捕获。然后匹配⼏个任意字符并且捕获他,最后 %1 匹配与第⼀次捕获到的(即引号)相同的字串。所以整个模式匹配到的是 "it's a cat", ⽽第⼆次捕获的是去掉两头引号的字串,即 it's a cat.
'-' 与 '*' 到底有什么不同呢?在上⾯, "(["'])(.*)%1" 匹配到的结果与 '-' 是⼀样的。尽可能匹配更长,尽可能匹配更短究竟什么不同呢?看例⼦:
print( ("\"hello\" \"hello\""):find('"(.+)"') )  ----输出 1 15 hello" "hello
print( ("\"hello\" \"hello\""):find('"(.-)"') )  ----输出 1 7 hello
* 尽可能长,所以匹配了⾸尾两个引号,捕获了中间的 (hello" "hello)
- 尽可能短,所以碰到第⼆个引号就说匹配完了,因此只捕获了第⼀个 (hello)
我们可以⽤string.find 搭配匹配字符获得我们想要的字串
date = "17/7/1990"
_, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y)      --> 17 7 1990
5. verse(arg)
—>字符串反转
--auL
6. string.format(...)
返回⼀个类似printf的格式化字符串
string.format("the value is:%d",4)
--the value is:4
7. string.char(arg) 和 string.byte(arg[,int])
char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第⼀个字符)。
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
8. string.len(arg)
计算字符串长度
string.len("abc")
--3
9. p(string, n)
回字符串string的n个拷贝
abcdabcd
10. atch(str, pattern)
return⼀个迭代器函数,每⼀次调⽤这个函数,会返回⼀个在字符串str 到的下⼀个符合pattern 描述的⼦串。如果参数pattern 描述的字符串没有到,迭代函数返回nil。
for word atch("Hello Lua user", "%a+")
do
print(word)
end
Hello
Lua
user
11. string.match(str, pattern, init)
string.match()只寻源字串str中的第⼀个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。
local path = "c:/home/"
local name = string.match(path, ".+/(.+)")
print("name:", name)
--1.txt
string.match("I have 2 questions for you.", "%d+ %a+")
--2 questions
string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
--2, "questions"
12. string.sub(str,i[,j])
⽤于字符串截取,返回截取长度的字符串(区间为闭)
a = "abc1test 123"
print (string.sub(a,2))
--bc1test 123
print (string.sub(a,2,4))
--bc1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。