如何在Lua中转义多行字符串中的括号

这是来自书籍《Lua程序设计》第3版的练习题。

Exercise2.4:如何在Lua中将以下XML片段嵌入为字符串?

请至少列举两种不同的方法。

以下是我的答案:

 s = "<![CDATA\n  Hello world\n]]>"
 print(s)

 s2 = [[
 <![CDATA
    Hello world
  \]\]>
 ]]
 print(s2)

输出结果为:

<![CDATA
 Hello world
]]>
<![CDATA
 Hello world
\]\]>

方法1是正确的。而方法2的输出结果与预期不符。如果没有反斜杠字符,Lua将显示错误:

 lua: execrcise-4.1.lua:7: unexpected symbol near ']'

所以我有一个问题,如何在Lua中转义多行字符串中的括号?

我的Lua解释器版本是5.4.2。

点赞
用户2858170
用户2858170

实际上,这个练习的重点在于你找出如何解决这个问题。

最好通过阅读Lua手册来学习。

在那里,你会学到为长字符串定义开启和关闭括号时要设置级别。

可以使用长格式来定义文字字符串,其由括在长括号内部的一段文本组成。我们将 n 级开启长括号定义为由一个开放的方括号, 后面跟有 n 个等号,再后面跟有另一个开放的方括号。因此,级别为 0 的开方长括号写为 [[,级别为 1 的开方长括号写为 [=[,以此类推。 同样,关闭长括号的定义方法也一样;例如,级别为 4 的关闭长括号写为 ]====]。长文字按照级别任意开启,以第一个同样级别的关闭长括号结束。 除了同级别的关闭括号之外,长文字可以包含任何文本。

s2 = [[
 <![CDATA
    Hello world
  ]]>
 ]]

违反了上述要求,因为你过早地关闭了长字符串,留下了两个额外的括号,导致了语法错误。

那么,如果字符串不能包含级别为 0 ]] 的关闭括号,该怎么办呢?我们增加长字符串的级别。

s2 = [=[
 <![CDATA
    Hello world
  ]]>
 ]=]

顺便提一下,你不能在Lua字符串中用反斜杠转义方括号。你没有因为无效的转义序列\]而得到错误的原因是长字符串忽略了转义序列。

2021-02-26 09:51:13