基础字符串模式¶
Time:5 分钟
字符串模式是一种字符组合,可用于查找存在于较长字符串当中的具体片段(通常称为_子字符串_)。
在您的游戏中,您可以使用字符串模式找到一个单词中的所有字母 A,或者查找句子中的数字。
简单匹配¶
简单的匹配可以通过 Lua 的 Lua Libraries/string|string.match()
函数来完成。此示例中,我们将在两个字符串中查找单词 Roblox:
print( string.match("Welcome to Roblox!", "Roblox") )
print( string.match("Welcome to my awesome game!", "Roblox") )
Roblox
nil
如您所见,我们在第一个字符串中找到了匹配项,因此向控制台输出了 Roblox
。但我们在第二个字符串中没有找到匹配项,所以输出了 nil
。
完美匹配¶
简单匹配的作用是很有限的,最多只能实现这样的查找。下面请考虑这三种陈述:
云之国有 25 个力量宝石
闹鬼矿洞有 10 个力量宝石
巫师村有 50 个力量宝石
假设您只想提取每个世界中“力量宝石”的数量(25、10 或 50),因为每个世界中的宝石数量不同,所以您并不能使用简单匹配,而需要使用字符类搜索每条语句。
简单地说,字符类提供了一种方法,能用来搜索并不_具体_但又符合某一已知类别(类)的内容。在 Lua 中,您可以在字符串中搜索字母、数字、空格、标点符号等。
下表中是一些常见的和有用的字符类:
类 代表 匹配示例
.
任意字符
32kasGJ1%fTlk?@94
%a
任意大小写的字母
aBcDeFgHiJkLmNoPqRsTuVwXyZ
%l
小写字母
abcdefghijklmnopqrstuvwxyz
%u
大写字母
ABCDEFGHIJKLMNOPQRSTUVWXYZ
%d
任意数字
0123456789
%p
任意标点符号
!@#;,.
%w
任意数字或字母
aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789
%s
空格或空格字符
_
、\n
和 \r
使用字符类¶
上面的表格可能看起来难以消化,但是不要担心,我们将通过一些基本的示例向您展示它的作用。
首先让我们看看这个陈述:
云之国有 25 个力量宝石
在表中我们可以看到 %d
字符类允许您在字符串中查找数字,正好就能用来找出每个虚构的游戏世界中有多少“力量宝石”!让我们来试试这些代码:
print( string.match("The Cloud Kingdom has 25 power gems", "%d") )
2
注意这段代码输出的是 2
— 可是云之国有 25 个力量宝石,而不是 2 个呀!那到底出了什么问题呢?
有关字符类的一个重要细节是,它们本身只匹配字符串中的一个字符。上面的模式(%d
)从左到右开始读取字符串,查找它找到的_第一个_数字(2
),然后就停止了!
好在您还可以使用量词来扩展字符类的功能。
量词¶
Quantifier(量词)是在字符类之后键入的符号,它允许您匹配特定数量的某类字符。
量词 含义
+
匹配大于等于 1 个指定类别的字符
-
匹配尽可能少的指定类别的字符
*
匹配大于等于 0 个指定类别的字符
?
匹配小于等于 1 个指定类别的字符
让我们使用量词来找到云之国力量宝石的正确数量吧:
local pattern = "%d+" -- 注意 '+' 量词要在 '%d' 之后
print( string.match("The Cloud Kingdom has 25 power gems", pattern) )
25
如您所见,此模式找到第一个数字(2
),并继续查找到了 5
!而且它还会继续查找更多的数字(如果它们存在),例如:
local pattern = "%d+"
print( string.match("The Cloud Kingdom has 25 power gems", pattern) )
print( string.match("The Cloud Kingdom has 25001000 power gems", pattern) )
25
25001000
组匹配¶
…