这是《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。
实际上,这个练习的重点是让你找出如何解决这个问题。
最好通过阅读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 字符串中使用反斜杠转义方括号。您没有收到无效转义序列错误的唯一原因\]是长字符串会忽略转义序列。