【问题标题】:How to escape brackets in a multi-line string in Lua如何在 Lua 中转义多行字符串中的括号
【发布时间】:2021-02-26 18:14:32
【问题描述】:

这是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。

【问题讨论】:

    标签: lua


    【解决方案1】:

    其实这个练习的全部意义在于你找出解决这个问题的方法。

    最好阅读Lua manual

    在那里你会了解到长字符串的左括号和右括号是有等级的。

    文字字符串也可以使用长格式来定义 长括号。我们将第 n 级的左长括号定义为 左方括号后跟 n 个等号,后跟另一个 开方括号。所以,一个 0 级的开长括号是 写成 [[,第 1 级的左长括号写成 [=[, 等等。闭合长括号的定义类似;例如, 级别 4 的右长括号写为 ]====]。一个长字 以任何级别的开始长括号开始,并在第一个结束 关闭同级别的长括号。 它可以包含任何文本,除了 同一级别的右括号。

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

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

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

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

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

    【讨论】:

    • 它解决了我的问题,谢谢。我阅读了手册并意识到左括号“[[”之后的文本不能包含右括号“]]”。这就是为什么我们需要等号来增加级别。
    猜你喜欢
    • 2016-03-15
    • 2014-01-24
    • 2016-01-13
    • 2011-08-09
    • 2019-12-18
    • 2010-12-16
    • 2011-08-29
    • 2017-07-20
    相关资源
    最近更新 更多