基础字符串模式

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 个力量宝石

假设您只想提取每个世界中“力量宝石”的数量(251050),因为每个世界中的宝石数量不同,所以您并不能使用简单匹配,而需要使用字符类搜索每条语句。

简单地说,字符类提供了一种方法,能用来搜索并不_具体_但又符合某一已知类别(类)的内容。在 Lua 中,您可以在字符串中搜索字母数字空格标点符号等。

https://developer.roblox.com/assets/bltad916cfeb252618d/Character-Tiles.png

下表中是一些常见的和有用的字符类:

类 代表 匹配示例

. 任意字符 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

组匹配

字符串捕捉

***Roblox官方链接:基础字符串模式