跳转到内容

Scribunto:入门/字符串

来自维基教科书,开放的书籍,开放的世界

在 Scribunto 中,您大部分时间可能会处理文本。您可能还记得,程序员将一段文本称为字符串。幸运的是,Lua 为程序员提供了很大的灵活性来输入和操作字符串。在本节中,我们将介绍一些字符串基础知识。

字符串输入

[编辑 | 编辑源代码]

在我们第一个调试控制台中的程序中,我们用双引号包围了要显示的文本。

代码:

= "Hello, world!"

输出:

Hello, world!

双引号告诉 Lua 我们输入的是一个字符串,而不是其他 Lua 命令。但是,不仅仅是双引号可以创建字符串。您可以使用单引号来做完全相同的事情。

代码:

= 'Hello, world!'

输出:

Hello, world!

如果您的文本包含双引号或单引号,您可以使用另一种类型的引号来避免它。

代码:

= 'Susan said, "Hello!"'

输出:

Susan said, "Hello!"

代码:

= "This is Jim's book."

输出:

This is Jim's book.

如果尝试使用相同类型的引号,您将收到错误,因为 Lua 不知道哪些引号是文本的一部分,哪些引号应该用作字符串的结束。

代码:

= "Susan said, "Hello!""

输出:

Lua error in console input at line 7: ')' expected near 'Hello'.

转义序列

[编辑 | 编辑源代码]

能够使用单引号或双引号来创建字符串非常方便。但是,如果我们要输入的文本包含单引号和双引号,会发生什么?处理这种情况的一种方法是使用转义序列。在带单引号或双引号的字符串中,我们可以使用反斜杠 \ 来告诉 Lua 引号应该被解释为文本中的引号,而不是表示字符串结尾的引号。

代码:

= 'Susan said, "Jim said, \'Hello!\'"'

输出:

Susan said, "Jim said, 'Hello!'"

如果您将反斜杠与一些字母一起使用,那么它们可能具有特殊含义。例如,\n 插入一个换行符。

代码:

= 'Hello, world!\nHello, Jim!\nHello, Susan!'

输出:

Hello, world!
Hello, Jim!
Hello, Susan!

您还可以通过在行末添加反斜杠来将文字换行符插入字符串。当您在调试控制台中尝试此操作时,您需要在每行末按 Shift + Enter。如果您只按 Enter,您的代码将被运行,Lua 会抛出错误,因为它找不到字符串的结尾。

代码:

= 'Hello, world!\
Hello, Jim!\
Hello, Susan!'

输出:

Hello, world!
Hello, Jim!
Hello, Susan!

Lua 还提供其他转义序列,例如 \t 代表水平制表符,\v 代表垂直制表符。也可以通过使用反斜杠后跟 0 到 255 之间的数字来指定字符;例如,\65 是字母 "A"。但是,您不太可能需要使用这些。

要将反斜杠字符插入文本中,而不赋予其任何特殊含义,您需要用另一个反斜杠对其进行转义。

代码:

= 'C:\\Windows'

输出:

C:\Windows

长括号

[编辑 | 编辑源代码]

我们已经看到转义序列允许我们创建包含单引号和双引号的字符串。但实际上,我们还有另一种方法可以做到这一点:使用长括号。要创建一个长括号字符串,您用双方括号包围您的文本。

代码:

= [[Susan said, "Jim said, 'Hello!'"]]

输出:

Susan said, "Jim said, 'Hello!'"

长括号字符串可以跨多行扩展,无需任何特殊格式。出于这个原因,它们也被称为多行字符串。再次提醒,在调试控制台中,当您想开始新行时,请记住输入 Shift + Enter,而不仅仅是 Enter。

代码:

= [[Hello, world!
Hello, Jim!
Hello, Susan!]]

输出:

Hello, world!
Hello, Jim!
Hello, Susan!

为了帮助模块代码的格式化,如果长括号字符串以新行开头,那么该新行不会出现在输出中。(但这只适用于字符串的开头,而不是结尾;如果您在字符串末尾添加一个额外的换行符,它将被解释为字符串的一部分。)

代码:

= [[
Hello, world!
Hello, Jim!
Hello, Susan!]]

输出:

Hello, world!
Hello, Jim!
Hello, Susan!

不能在长括号字符串中使用转义序列。所有这样的序列将被逐字解释。

代码:

= [[Hello, world!\nHello, Jim!\nHello, Susan!]]

输出:

Hello, world!\nHello, Jim!\nHello, Susan!

您可能已经注意到,这种双方括号语法与在 MediaWiki 中创建维基链接的语法相同。由于这种巧合,很容易找到字符串同时包含单引号、双引号和双方括号的情况。但是,Lua 仍然有办法处理这种情况。

这个问题可以通过在两个方括号之间使用等号来解决。在 Lua 中,您可以使用等号来区分长括号的级别。例如,[=[Hello, world!]=][==[Hello, world!]==][=====[Hello, world!]=====] 都会生成字符串 "Hello, world!"。只需确保您使用相同数量的等号来开始和结束长括号。

代码:

= [=[Sally said, "He was reading the [[Schrödinger's cat]] article."]=]

输出:

Sally said, "He was reading the [[Schrödinger's cat]] article."

您可以在长括号字符串中的字符串内包含双括号,只要它们不与开始和结束括号冲突。

代码:

= [=[The [[Wikipedia]] article]=]

输出:

The [[Wikipedia]] article

代码:

= [[The [[Wikipedia]] article]]

输出:

Lua error in console input at line 7: nesting of [[...]] is deprecated near '['.

此外,双方括号在出现在普通字符串中时不会被特殊处理。因此,对于日常使用,最好使用普通字符串,并将长括号字符串保留用于处理多行或其他需要大量转义序列的情况。

代码:

= "The [[Wikipedia]] article"

输出:

The [[Wikipedia]] article

连接字符串

[编辑 | 编辑源代码]

您可能经常发现自己想将两个字符串连接在一起。这可以使用连接运算符 .. 来完成。

代码:

= "Hello, " .. "Fred!"

输出:

Hello, Fred!
华夏公益教科书