Lua 字符串操作

本指南讨论如何在 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() 根据给定字符串是否以指定字符结尾,返回布尔值 truefalse
string.find() 在字符串中查找第一个匹配模式的位置。如果找到,则返回匹配出现的起始和结束索引;否则,返回 nil
string.format() 根据其参数中给定的描述返回格式化字符串。
string.gmatch() 返回一个模式查找迭代器。
string.gsub() 替换字符串中所有出现的模式
string.len() 返回字符串的长度(字符数)。
string.lower() 将字符串中的大写字符更改为小写。
string.match() 通过在字符串中匹配模式来提取子字符串。
string.rep() 通过返回指定字符串的 n 个副本的串联来复制字符串。
string.reverse() 反转字符串。
string.starts() 根据给定字符串是否以指定字符开头,返回布尔值 truefalse
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]可能不等于 `%l`。

模式和模式项

**模式**是**模式项**(见下文)的序列。模式开头的 `^` 将匹配锚定在主题字符串的开头。模式末尾的 `$` 将匹配锚定在主题字符串的末尾。在其他位置,`^` 和 `$` 没有特殊含义,仅代表它们自己。模式不能包含嵌入的零;请改用 `%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。