第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但存在一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目。
用 Lua 编程 | ||
第三部分。标准库 第 20 章。字符串库 |
原始 Lua 解释器处理字符串的能力非常有限。程序可以创建字符串文字并对其进行连接。但它不能提取子字符串、检查其大小或检查其内容。Lua 中处理字符串的全部能力来自其字符串库。
字符串库中的一些函数非常简单:string.len(s)
返回字符串 s
的长度。string.rep(s, n)
返回字符串 s
重复 n
次。您可以使用 string.rep("a", 2^20)
创建一个包含 1M 字节的字符串(例如,用于测试)。string.lower(s)
返回 s
的副本,其中大写字母已转换为小写;字符串中的所有其他字符均未更改(string.upper
转换为大写)。作为典型用法,如果您想对字符串数组进行排序而不考虑大小写,您可以编写类似以下内容:
table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end)
string.upper
和 string.lower
都遵循当前区域设置。因此,如果您使用欧洲拉丁语-1 区域设置,则表达式
string.upper("ação")将得到
"AÇÃO"
。
调用 string.sub(s,i,j)
提取字符串 s
的一部分,从第 i
个字符到第 j
个字符(包括)。在 Lua 中,字符串的第一个字符的索引为 1。您还可以使用负索引,从字符串的末尾开始计数:索引 -1 指向字符串中的最后一个字符,-2 指向倒数第二个字符,依此类推。因此,调用 string.sub(s, 1, j)
将获得长度为 j
的字符串 s
的前缀;string.sub(s, j, -1)
将获得字符串的后缀,从第 j
个字符开始(如果您未提供第三个参数,则默认为 -1,因此我们可以将最后一个调用写为 string.sub(s, j)
);string.sub(s, 2, -2)
返回字符串 s
的副本,其中删除了第一个和最后一个字符
s = "[in brackets]" print(string.sub(s, 2, -2)) --> in brackets
请记住,Lua 中的字符串是不可变的。string.sub
函数与 Lua 中的任何其他函数一样,不会更改字符串的值,而是返回一个新字符串。一个常见的错误是编写类似这样的内容
string.sub(s, 2, -2)并假设
s
的值将被修改。如果您想修改变量的值,则必须将新值分配给该变量
s = string.sub(s, 2, -2)
string.char
和 string.byte
函数在字符及其内部数字表示之间进行转换。函数 string.char
获取零个或多个整数,将每个整数转换为一个字符,并返回一个连接所有这些字符的字符串。函数 string.byte(s, i)
返回字符串 s
中第 i
个字符的内部数字表示;第二个参数是可选的,因此调用 string.byte(s)
将返回 s
的第一个(或单个)字符的内部数字表示。在以下示例中,我们假设字符以 ASCII 形式表示
print(string.char(97)) --> a i = 99; print(string.char(i, i+1, i+2)) --> cde print(string.byte("abc")) --> 97 print(string.byte("abc", 2)) --> 98 print(string.byte("abc", -1)) --> 99在最后一行,我们使用负索引来访问字符串的最后一个字符。
string.format
函数在对字符串(通常是输出)进行格式化时是一个强大的工具。它根据第一个参数(即所谓的格式字符串)给出的描述,返回其可变数量的参数的格式化版本。格式字符串的规则类似于标准 C 的 printf
函数的规则:它由常规文本和指令组成,这些指令控制每个参数在格式化字符串中的位置和方式。一个简单的指令是字符 `%
´ 加上一个字母,该字母告诉如何格式化参数:`d
´ 表示十进制数,`x
´ 表示十六进制数,`o
´ 表示八进制数,`f
´ 表示浮点数,`s
´ 表示字符串,以及其他变体。在 `%
´ 和字母之间,一个指令可以包含其他选项,这些选项控制格式的详细信息,例如浮点数的小数位数
print(string.format("pi = %.4f", PI)) --> pi = 3.1416 d = 5; m = 11; y = 1990 print(string.format("%02d/%02d/%04d", d, m, y)) --> 05/11/1990 tag, title = "h1", "a title" print(string.format("<%s>%s</%s>", tag, title, tag)) --> <h1>a title</h1>在第一个示例中,
%.4f
表示一个小数点后有四位数字的浮点数。在第二个示例中,%02d
表示一个十进制数(d
´),至少有两位数字且填充零;指令 %2d
(不带零)将使用空格进行填充。有关这些指令的完整说明,请参阅 Lua 参考手册。或者,更好的是,请参阅 C 手册,因为 Lua 在此处调用标准 C 库来完成艰苦的工作。
版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 |