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

Yao*_* Wu 2 lua

这是《lua编程语言第三版》一书中的练习题。

练习2.4:如何将以下 XML 片段作为字符串嵌入 Lua 中?

展示至少两种不同的方式。

这是我的回答:

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

 s2 = [[
 <![CDATA
    Hello world
  \]\]>
 ]]
 print(s2)
Run Code Online (Sandbox Code Playgroud)

和输出:

<![CDATA
 Hello world
]]>
<![CDATA
 Hello world
\]\]>
Run Code Online (Sandbox Code Playgroud)

方法1是对的。方式2的输出不符合预期。如果没有反斜杠字符,lua 将显示错误:

 lua: execrcise-4.1.lua:7: unexpected symbol near ']'
Run Code Online (Sandbox Code Playgroud)

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

我的lua解释器版本是5.4.2。

Pig*_*let 9

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

最好通过阅读Lua 手册

在那里您将了解到长字符串的左括号和右括号是有级别的。

文字字符串也可以使用长括号括起来的长格式来定义。我们将第 n 级的左长括号定义为一个左方括号,后跟 n 个等号,最后跟另一个左方括号。因此,级别 0 的左长括号写为 [[,级别 1 的左长括号写为 [=[,依此类推。右长括号的定义类似;例如,4 级的右长括号写为]====]。长文字以任何级别的左长括号开始,并以同一级别的第一个右长括号结束。它可以包含除同一级别的右括号之外的任何文本。

s2 = [[
 <![CDATA
    Hello world
  ]]>
 ]]
Run Code Online (Sandbox Code Playgroud)

违反了粗体规则,因为您过早地关闭长字符串,留下两个额外的括号,从而导致语法错误。

那么,如果字符串可能不包含级别 0 的右括号,您需要做什么]]?我们增加了长弦的水平。

s2 = [=[
 <![CDATA
    Hello world
  ]]>
 ]=]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你不能在 Lua 字符串中使用反斜杠转义方括号。您没有收到无效转义序列错误的唯一原因\]是长字符串会忽略转义序列。