X-Problem:我想将一个完整的lua脚本转储到单个字符串行,然后可以将其编译成C程序。
Y-问题:你如何用"
取代每个\"
?
我认为尝试这样的事情是有意义的
data = string.gsub(line, "c", "\c")
,其中c是"
字符。但这当然不起作用。
如果我理解你的Y问题,你需要转义引号和反斜杠:
data = string.gsub(line, "\"", "\\\"")
或使用其他单引号(仍然逃避反斜杠):
data = string.gsub(line, '"', '\\"')
X-Problem的解决方案是安全地转义任何可能干扰解释器的序列。
Lua有%q
的string.format选项,它将以这种方式格式化和转义提供的字符串,它可以被Lua安全地读回。你的C语译员也应如此。
示例字符串:This \string's truly"tricky
如果你只是将它括在单引号或双引号中,那么仍然会有一个早期结束字符串的引号。还有无效的转义序列\s
。
想象一下,这个字符串已经在Lua中正确处理了,所以我们只是将它作为参数传递:string.format("%q", 'This \\string\'s truly"tricky')
返回(注意,我在代码输入中使用单引号):
"This \\string's truly\"tricky"
现在,这是一个完全有效的Lua字符串,可以从文件中写入和读取。无需手动转义每个特殊字符并冒险实现错误。
要正确实现Y方法,要使用\
转义(无效)字符,请使用proper pattern matching将前缀+捕获字符串替换为捕获的字符串:
string.gsub('he"ll"o', "[\"']", "\\%1") -- will prepend backslash to any quote