lua脚本怎么取出自己想要的的部分字符
发布时间:2025-05-18 23:33:58 发布人:远客网络
一、lua脚本怎么取出自己想要的的部分字符
1、你好,以前没接触过lua,刚自己试了一下,就按照你问题中的"23^Hello^你好^2000^world.txt"这个字符串为例,以^为分隔符来说吧:
2、---------------start---------------
3、str="23^Hello^你好^2000^world.txt"
4、for w in string.gmatch(str,"[^^]+") do
5、---------------start---------------
6、第1行:定义一个变量str,内容为"23^Hello^你好^2000^world.txt",这也是我们要处理的字符串.
7、第二行:定义一个空列表,它是用在下面的for循环中,存放以"^"作为分隔符的每一部分
8、第三行:简单来看是个for循环,深入一点来看,也就是string.gmatch(str,"[^^]+")这部分需要解释一下,它表示调用的是string库的gmatch()函数,这个函数有两个参数,第1个参数为要处理的字符串,咱们这里就是上面定义的str,第二个参数就是我们要在这个字符串中匹配什么样的内容,这里的匹配内容写的是"[^^]+",学过正则的很好理解,单纯的[abc]表示匹配任意单个字符a或b或c,有一点特殊的是一旦[]中的字符是以^打头的,则表示匹配任意非[]中列出的字符,如[^abc]表示匹配任意除abc外的其它任一字符,所以[^^]解释为匹配除^外的任一字符,举例来说,如果我们有字符串"23^Hello",如果用[^^]匹配的话,最终得到的是7个单个字符,即"2","3","H","e","l","l","o",显示这不符合我们的题意,所以在这基础上改进了一下,即在其后又加了个+号,[^^]+,这里的+号表示尽可能多地匹配它前面内容,这里也就是尽可能多地匹配[^^],所以[^^]+在处理"23^Hello"的时候,结果得到的就是"23","Hello".这里关于用到的这个正则说的不是太清楚,多练练就明白了。最后,第3行把函数部分给替换掉后,可以理解为:for w in [23,Hello,你好,2000,world.txt],每次从[]中取一个值赋给w,然后执行for下面的语句,接着往下看
9、第4行,接第3行尾,就是把每次赋给w的值都打印出来
10、第5行,将每次赋给w的值都追加到列表list中
11、第6行,for循环语法上的闭合关键字,这个没啥说的
12、到此,我们得到了一个列表值为[23,Hello,你好,2000,world.txt]的list,此时我们就可以使用list[n]来取我们想要的值了。
13、*.如果你要问上面最3条最后不都有[23,Hello,你好,2000,world.txt]了嘛,为啥还要那么麻烦,直接使用string.gmatch()函数不就行了嘛,其实第3条结尾我那么写只是为了让你好理解,实际上gmatch()函数的返回值并不是列表,而是一个可迭代的函数,而for循环的作用就是把gmatch()函数返回的这个可迭代的函数中的每个元素都取出来并赋给列表list
14、*.说的有点啰嗦了,希望对你有帮助吧,另外,我从没用过lua,也是刚查了查,自己实践了一下,希望不会形成误导
二、lua入门笔记7 字符串库
1、 Lua中的 string和 c#中相同, string类型的值一旦改变,便要为新值开辟空间,并指向此空间。也就是说每次对 string变量进行更改操作时返回的是一个新的值,下面的函数中就不再过多去说明了。
2、其他还有很多这里只是简单地举几个例子。
3、 Lua中由于考虑大小,没有支持正则表达式。而采用了自己的模式匹配。
4、 string.find函数用于在一个给定的目标字符串中搜索一个模式。最简单的是搜索单词。如果赵傲这个单词,他就会返回单词的其实索引和结束所用,如果没找到则返回 nil
5、如果匹配成功,就可以用 string,find的返回值结果来调用 string.sub来提取出目标字符串中匹配于该模式的那部分子串。
6、 string.find还有一个可选的第三参数,他是一个索引,告诉函数应从目标字符串的那个位置开始搜索。
7、函数 string.math和函数 string.find在某种意义上很相似,它也是用一个在字符串中搜索的一种模式。不同的是, string.math返回的是目标字符串中模式匹配的那部分子串,而并非位置。
8、对于固定的模式,该函数可能没有什么意义例如"hello"。但当使用变量模式是,它的特性就显现出来了。
9、 string.gusb函数有3个参数:目标字符串、模式、替换字符串作用就是将所有出现该模式的地方替换为替换字符串
10、另外还有可选的第四个参数,可以限制替换的次数
11、函数是 string.gsub还有一种结果,即实际替换的次数,例如下面就是一种统计字符串中空格数量的简单方法
12、 string.gmatch会返回一个函数。通过这个函数可以遍历到一个字符串中所有出现指定摸式的地方。
13、其中模式"%a+"表示匹配一个或多个字母字符的序列(也就是单词),这里会遍历其中所有的单词,并存入其中。在模式中"点"具有特殊的意义,因此若要表示一个点必须写为"%."
14、介意用字符分类创建更多有用的模式。字符分类就是模式中的一项。可以与一个热顶级和中的任意字符相匹配。例如分类"%d"可匹配任意数字。例如可以用
15、"%d%d/%d%d/%d%d%d%d"来搜索符合"dd/mm/yyyy"格式的日期
16、这些分类的大写行使表示他们的补集,例如"%A"表示所有非字母字符
17、在模式里,还有一些字符串被称为“魔法字符”他们有着特殊的含义。这些魔法字符有
18、字符串%作为这些魔法字符的转义符,例如"%."表示匹配一个点"%%"表示匹配字符"%"不仅可以把"%"用于魔法字符,还可以用于其他所有非字母数字的字符。当不确定某个字符是不是需要被转义是,应该直接前置一个转义符。
19、对于 lua来说,模式就是普通的字符串。并想起他字符串一样遵循相同的规则。只有模式函数才会解释它们,此时参会将"%"当做转义符来处理。
20、在一堆放括号内将不同的字符分类或者单个字符组合起来,即可创造出属于用户自己的字符分类,这种新的字符分类叫做字符集(char-set)。例如,字符集 ["%w_"]表示同时匹配字母、数字和下划线。字符集 [01]表示匹配二进制数字字符集 [%[%]]表示匹配方括号本身。如果需要统计一段文本中元音的数量,可以这么写
21、在字符集中表示一段字符范围的做法是写出自付范围的第一个字符和最后一个字符并用横线连接它们,但这种形式用的较少因为大部分常用的字符范围都已经预定义好了。如 [0-9]即为%d
22、 [0-9a-fA-F]则为"%x"不过如果需要查找一个8进制的数字,那么可以写 [0-7]而不是 [01234567]。在一个字符集前加一个'^'即可表示这个字符集的补集。例如 [^0-7]表示所有非八进制数字的字符。而模式 [^\n]则表示了除了换行符之外的其他字符。对于简单地分类,使用大写形式也可以得到他的补集,"%S"显然比 [^%s]简答
23、也可以通过修饰符来藐视模式中的重复可选部分。lua提供四种修饰符
24、“+”修饰符科普配属于字符串分类的一个或多个字符。他总是获取与模式相匹配的最长序列,模式"%a+"表示一个或多个字母,即单词:
25、模式"%d+"匹配一个或多个数组(一个整数)
26、修饰符"*"类似于"+",但它还接受出现0次的情况。一种典型用途是匹配一个模式不同部分之间的空格。比如说像匹配()或者()这样的一对圆括号,可以用"%(%s*%)"其中的%s*可以匹配0到多个空格
27、另一个示例是使用模式"[_%a][_%w]*"来匹配lua中的标识符,标识符是一个由字母或下划线开始,伴随0到多个下划线、字母或数字的序列。
28、修饰符"-"和"*"一样,也是用于匹配0个或多个字符的。不过他会匹配最短的子串。虽然看似二者没什么差别但效果截然不同。如果使用"[_%a][_%w]-"来查找一个标识符时,他只会查找到第一个字母,因为"[_%w]-"总是匹配空串。假设要查找一个c程序中的注释,通常会首先尝试"/%*.*%/"然后由于".*"会尽可能的扩展,因此程序中第一个"/*"只会与最后一个"*/"相匹配
29、修饰符"?"用于匹配一个可选的字符。例如要在一段文本中寻找一个整数,而这个整数可以包括一个可选的正负号。那么适用模式"[+-]?%d+"就可以完成这项任任务。他可以匹配项
30、"-12""23""+1000"这样的数字,而"[+-]"是一个匹配'+'号和'-'号的字符分类,后面的'?'说明可这个符号是可选的。与其他系统不同的是,Lua中的修饰符只能用用于一个字符分类,无法对一组分类进行修饰。无法写出一个匹配可选打次的模式。
31、如果一个模式以一个'^'起始,那么他只会匹配目标字符串的开头部分。如果模式以'$'结尾,他只会匹配目标字符串的结尾部分。
32、在模式中,还可以用"%b",用于匹配成对的字符。他的写法是"%b<x><y>"其中<x>和<y>是两个不同的字符串,<x>作为一个起始字符,<y>是作为一个结束字符。例如模式"%b()"可匹配以'('开始,并以')'结束的子串s
33、 Lua中的 string和 c#中相同, string类型的值一旦改变,便要为新值开辟空间,并指向此空间。也就是说每次对 string变量进行更改操作时返回的是一个新的值,下面的函数中就不再过多去说明了。
34、其他还有很多这里只是简单地举几个例子。
35、 Lua中由于考虑大小,没有支持正则表达式。而采用了自己的模式匹配。
36、 string.find函数用于在一个给定的目标字符串中搜索一个模式。最简单的是搜索单词。如果赵傲这个单词,他就会返回单词的其实索引和结束所用,如果没找到则返回 nil
37、如果匹配成功,就可以用 string,find的返回值结果来调用 string.sub来提取出目标字符串中匹配于该模式的那部分子串。
38、 string.find还有一个可选的第三参数,他是一个索引,告诉函数应从目标字符串的那个位置开始搜索。
39、函数 string.math和函数 string.find在某种意义上很相似,它也是用一个在字符串中搜索的一种模式。不同的是, string.math返回的是目标字符串中模式匹配的那部分子串,而并非位置。
40、对于固定的模式,该函数可能没有什么意义例如"hello"。但当使用变量模式是,它的特性就显现出来了。
41、 string.gusb函数有3个参数:目标字符串、模式、替换字符串作用就是将所有出现该模式的地方替换为替换字符串
42、另外还有可选的第四个参数,可以限制替换的次数
43、函数是 string.gsub还有一种结果,即实际替换的次数,例如下面就是一种统计字符串中空格数量的简单方法
44、 string.gmatch会返回一个函数。通过这个函数可以遍历到一个字符串中所有出现指定摸式的地方。
45、其中模式"%a+"表示匹配一个或多个字母字符的序列(也就是单词),这里会遍历其中所有的单词,并存入其中。在模式中"点"具有特殊的意义,因此若要表示一个点必须写为"%."
46、介意用字符分类创建更多有用的模式。字符分类就是模式中的一项。可以与一个热顶级和中的任意字符相匹配。例如分类"%d"可匹配任意数字。例如可以用
47、"%d%d/%d%d/%d%d%d%d"来搜索符合"dd/mm/yyyy"格式的日期
48、这些分类的大写行使表示他们的补集,例如"%A"表示所有非字母字符
49、在模式里,还有一些字符串被称为“魔法字符”他们有着特殊的含义。这些魔法字符有
50、字符串%作为这些魔法字符的转义符,例如"%."表示匹配一个点"%%"表示匹配字符"%"不仅可以把"%"用于魔法字符,还可以用于其他所有非字母数字的字符。当不确定某个字符是不是需要被转义是,应该直接前置一个转义符。
51、对于 lua来说,模式就是普通的字符串。并想起他字符串一样遵循相同的规则。只有模式函数才会解释它们,此时参会将"%"当做转义符来处理。
52、在一堆放括号内将不同的字符分类或者单个字符组合起来,即可创造出属于用户自己的字符分类,这种新的字符分类叫做字符集(char-set)。例如,字符集 ["%w_"]表示同时匹配字母、数字和下划线。字符集 [01]表示匹配二进制数字字符集 [%[%]]表示匹配方括号本身。如果需要统计一段文本中元音的数量,可以这么写
53、在字符集中表示一段字符范围的做法是写出自付范围的第一个字符和最后一个字符并用横线连接它们,但这种形式用的较少因为大部分常用的字符范围都已经预定义好了。如 [0-9]即为%d
54、 [0-9a-fA-F]则为"%x"不过如果需要查找一个8进制的数字,那么可以写 [0-7]而不是 [01234567]。在一个字符集前加一个'^'即可表示这个字符集的补集。例如 [^0-7]表示所有非八进制数字的字符。而模式 [^\n]则表示了除了换行符之外的其他字符。对于简单地分类,使用大写形式也可以得到他的补集,"%S"显然比 [^%s]简答
55、也可以通过修饰符来藐视模式中的重复可选部分。 lua提供四种修饰符
56、“+”修饰符科普配属于字符串分类的一个或多个字符。他总是获取与模式相匹配的最长序列,模式"%a+"表示一个或多个字母,即单词:
57、模式"%d+"匹配一个或多个数组(一个整数)
58、修饰符"*"类似于"+",但它还接受出现0次的情况。一种典型用途是匹配一个模式不同部分之间的空格。比如说像匹配()或者()这样的一对圆括号,可以用"%(%s*%)"其中的%s*可以匹配0到多个空格
59、另一个示例是使用模式"[_%a][_%w]*"来匹配 lua中的标识符,标识符是一个由字母或下划线开始,伴随0到多个下划线、字母或数字的序列。
60、修饰符"-"和"*"一样,也是用于匹配0个或多个字符的。不过他会匹配最短的子串。虽然看似二者没什么差别但效果截然不同。如果使用"[_%a][_%w]-"来查找一个标识符时,他只会查找到第一个字母,因为"[_%w]-"总是匹配空串。假设要查找一个c程序中的注释,通常会首先尝试"/%*.*%/"然后由于".*"会尽可能的扩展,因此程序中第一个"/*"只会与最后一个"*/"相匹配
61、修饰符"?"用于匹配一个可选的字符。例如要在一段文本中寻找一个整数,而这个整数可以包括一个可选的正负号。那么适用模式"[+-]?%d+"就可以完成这项任任务。他可以匹配项
62、"-12""23""+1000"这样的数字,而"[+-]"是一个匹配'+'号和'-'号的字符分类,后面的'?'说明可这个符号是可选的。与其他系统不同的是, Lua中的修饰符只能用用于一个字符分类,无法对一组分类进行修饰。无法写出一个匹配可选打次的模式。
63、如果一个模式以一个'^'起始,那么他只会匹配目标字符串的开头部分。如果模式以'$'结尾,他只会匹配目标字符串的结尾部分。
64、在模式中,还可以用"%b",用于匹配成对的字符。他的写法是"%b<x><y>"其中<x>和<y>是两个不同的字符串,<x>作为一个起始字符,<y>是作为一个结束字符。例如模式"%b()"可匹配以'('开始,并以')'结束的子串
65、 s="a(enclosed(in) parenthesses) line"
66、 print(string.gsub(s,"%d()","")-->a line
67、这种模式的典型用法包括"%b()""%b[]""%b{}""%b<>"
68、捕获功能可根据一个模式从目标字符串中抽出匹配与该模式的内容。在指定捕获时,应将模式中需要捕获的部分写到一对圆括号内。
69、这里括号中的值为匹配两个单词,括号外是首先匹配空格然后匹配等号继续匹配空格。并且会把表达式中用()括起来的值返回。
三、Lua 字符串处理
1、本文主要讲述了Lua语言中字符串处理的相关知识。在项目中遇到的通用函数,其实源于Lua字符串处理库。库中提供了多种字符串处理函数,包括查找、子串、模式匹配等。在Lua中,字符串索引从1开始计算,支持负数索引,从字符串末尾反向解析。
2、Lua字符串处理库位于表string中,表中的函数可作为元表的__index域,支持面向对象形式使用,如使用`s:byte(i)`代替`string.byte(s,i)`。字符串由数字、字母、下划线组成。在Lua中,字符串表示方式有三种:单引号、双引号、[[和]]。
3、转义字符用于表示不能直接显示的字符,如使用"\"表示双引号。Lua提供了丰富的字符串操作方法,如查找、子串、模式匹配等。例如,`string.find(s,pattern)`用于查找字符串`s`中匹配到的`pattern`。同时,库中还提供了序列化函数,如`string.dump()`,将函数转化为字符串保存,可以在需要时取出来使用。
4、字符串库中的函数如`string.byte(s[,i[,j]])`、`string.char(...)`、`string.dump(function[,strip])`等,分别用于获取内部数字编码、将整型数字转为字符、序列化函数等。字符串操作还包括`string.format(formatstring,...)`用于格式化字符串,`string.gmatch(s,pattern)`用于迭代字符串中的匹配项,`string.gsub(s,pattern,repl[,n])`用于替换字符串中的匹配项,`string.len(s)`用于获取字符串长度,`string.lower(s)`和`string.upper(s)`用于转换字符串大小写,`string.match(s,pattern[,init])`用于匹配字符串。
5、匹配模式在Lua中使用常规字符串描述,用于模式匹配函数,如`string.find()`、`string.gmatch()`、`string.gsub()`、`string.match()`。模式条目可以是单个字符类、单个字符类加乘号、单个字符类加减号、单个字符类加问号、`%n`等。模式是一个模式条目的序列,可以使用`^`和`$`锚定匹配范围。模式匹配中还有捕获物的概念,用于保存匹配到的子串。