本指南讨论如何在 Lua 中操作和匹配字符串。
Corona string 库提供用于字符串操作的通用函数,例如模式匹配和查找/提取子字符串。在 Lua 中索引字符串时,第一个字符位于位置 1,而不是像 C 语言那样位于位置 0。允许索引为负数,并将其解释为从字符串末尾向后索引。因此,最后一个字符位于位置 -1,依此类推。
string 库在其表 string 中提供所有函数。它还为字符串设置了一个元表,其中 __index
字段指向 string 表。因此,您可以使用面向对象风格的字符串函数。例如,string.byte(s,i)
可以写成 s:byte(i)
。
string 库采用单字节字符编码。
函数 | 描述 |
---|---|
string.byte() | 返回字符串中字符的内部数字代码。 |
string.char() | 返回一个字符串,其中每个字符的内部数字代码与其对应的参数相等。 |
string.ends() | 根据给定字符串是否以指定字符结尾,返回布尔值 true 或 false 。 |
string.find() | 在字符串中查找第一个匹配模式的位置。如果找到,则返回匹配出现的起始和结束索引;否则,返回 nil 。 |
string.format() | 根据其参数中给定的描述返回格式化字符串。 |
string.gmatch() | 返回一个模式查找迭代器。 |
string.gsub() | 替换字符串中所有出现的模式。 |
string.len() | 返回字符串的长度(字符数)。 |
string.lower() | 将字符串中的大写字符更改为小写。 |
string.match() | 通过在字符串中匹配模式来提取子字符串。 |
string.rep() | 通过返回指定字符串的 n 个副本的串联来复制字符串。 |
string.reverse() | 反转字符串。 |
string.starts() | 根据给定字符串是否以指定字符开头,返回布尔值 true 或 false 。 |
string.sub() | 返回子字符串(现有字符串的指定部分)。 |
string.upper() | 将字符串中的小写字符更改为大写。 |
字符串函数,例如 string.find()、string.match()、string.gmatch() 和 string.gsub(),通常需要一个**字符串模式**来进行搜索和替换。必须非常小心地构造模式,否则函数将返回 nil
或字符串将被错误地更改。
**字符类**用于表示一组字符。在描述字符类时允许使用以下组合,其中该类**不是**魔术字符 ^
、$
、(
、)
、%
、.
、[
、]
、*
、+
、-
或 ?
之一。
类 | 描述 |
---|---|
. |
表示所有字符。 |
%a |
表示所有字母。 |
%c |
表示所有控制字符。 |
%d |
表示所有数字。 |
%l |
表示所有小写字母。 |
%p |
表示所有标点符号。 |
%s |
表示所有空格字符。 |
%u |
表示所有大写字母。 |
%w |
表示所有字母数字字符。 |
%x |
表示所有十六进制数字。 |
%z |
表示表示为 0 的字符。 |
%x |
当 x 是任何非字母数字字符时,这是转义魔术字符的标准方法。任何标点符号(即使是非魔术符号)在模式中用来表示自身时,前面都可以加上 % 。 |
[set] |
表示 `set` 中所有字符的并集。可以通过用 `-`(连字符)分隔范围的结束字符来指定字符范围。 上面描述的所有类也可以用作集合中的组件。`set` 中的所有其他字符代表它们自己。例如,`[%w_]` 或 `[_%w]` 表示所有字母数字字符加上下划线。[0-7] [0-7%l%-] [%a-z] [a-%%] |
[^set] |
表示如上所述的 `set` 的补集。 |
对于由单个字母表示的所有类 — `%a`、`%c` 等 — 相应的大写字母表示该类的补集。例如,`%S` 表示所有
字母、空格和其他字符组的定义取决于当前的区域设置。特别是,类[a-z]
**模式**是**模式项**(见下文)的序列。模式开头的 `^` 将匹配锚定在主题字符串的开头。模式末尾的 `$` 将匹配锚定在主题字符串的末尾。在其他位置,`^` 和 `$` 没有特殊含义,仅代表它们自己。模式不能包含嵌入的零;请改用 `%z`。
**模式项**由以下任何一项定义
单个字符类,匹配该类中的任何单个字符。
后跟 `*` 的单个字符类,匹配该类中字符的 0 次或多次重复。这些重复项将始终匹配尽可能长的序列。
后跟 `+` 的单个字符类,匹配该类中字符的 1 次或多次重复。这些重复项将始终匹配尽可能长的序列。
后跟 `-` 的单个字符类,也匹配该类中字符的 0 次或多次重复。与 `*` 不同,这些重复项将始终匹配尽可能短的序列。
后跟 `?` 的单个字符类,匹配该类中字符的 0 次或 1 次出现。
`%n`,其中 `n` 介于 1 和 9 之间;此模式匹配等于第 `n` 个捕获字符串的子字符串(参见下文)。
`%bxy`,其中 `x` 和 `y` 是两个不同的字符;此模式项匹配以 `x` 开头,以 `y` 结尾,并且 `x` 和 `y` 平衡的字符串。更清楚地说,如果从左到右读取字符串,`x` 计数为 +1,`y` 计数为 -1,则结尾的 `y` 是计数达到 0 的第一个 `y`。例如,项 `%b()` 匹配带有平衡括号的表达式。
模式可以包含括在括号中的子模式。这些描述了**捕获**。当匹配成功时,匹配捕获的主字符串的子字符串将被存储(捕获)以供将来使用。捕获根据其左括号编号。例如,在模式 `(a*(.)%w(%s*))` 中,匹配 `a*(.)%w(%s*)` 的字符串部分存储为第一个捕获,因此编号为 1。匹配 `.` 的字符以编号 2 捕获,匹配 `%s*` 的部分以编号 3 捕获。
作为一种特殊情况,空捕获 `()` 捕获当前字符串位置(数字)。例如,如果我们将模式 `()aa()` 应用于字符串 `flaaap`,则将有两个捕获:3 和 5。