Как разбить большую строку lua на маленькие
У меня есть большая строка (образ с кодировкой base64) и длина 1050 символов. Как добавить большую строку, образованную из маленьких, например, в C
function GetIcon()
return "Bigggg string 1"\
"continuation of string"\
"continuation of string"\
"End of string"
Ответы
Ответ 1
Согласно Программирование в строках Lua 2.4:
Мы можем разграничить литеральные строки также путем сопоставления двойных квадратных скобок [[...]]. Литералы в этой заключенной в квадратные скобки форме могут работать для нескольких строк, могут гнездиться и не интерпретировать escape-последовательности. Более того, эта форма игнорирует первый символ строки, когда этот символ является символом новой строки. Эта форма особенно удобна для записи строк, содержащих фрагменты программы; например,
page = [[
<HTML>
<HEAD>
<TITLE>An HTML Page</TITLE>
</HEAD>
<BODY>
<A HREF="http://www.lua.org">Lua</A>
[[a text between double brackets]]
</BODY>
</HTML>
]]
Это самое близкое к тому, что вы просите, но с использованием вышеописанного метода хранятся новые строки, встроенные в строку, поэтому это не будет работать напрямую.
Вы также можете сделать это с помощью конкатенации строк (используя..):
value = "long text that" ..
" I want to carry over" ..
"onto multiple lines"
Ответ 2
Большинство ответов здесь решает эту проблему во время выполнения, а не во время компиляции.
Lua 5.2 представляет escape-последовательность \z
, чтобы решить эту проблему элегантно, не прибегая к расходам во время выполнения.
> print "This is a long \z
>> string with \z
>> breaks in between, \z
>> and is spanning multiple lines \z
>> but still is a single string only!"
This is a long string with breaks in between, and is spanning multiple lines but still is a single string only!
\z
пропускает все последующие символы в строке до первого непространственного символа. Это работает и для текста, не являющегося многострочным литералом.
> print "This is a simple \z string"
This is a simple string
Из Справочное руководство Lua 5.2
Управляющая последовательность '\ z' пропускает следующий пробел символов пробела, включая разрывы строк; особенно полезно разбить и отложить длинную литеральную строку на несколько строк без добавления строк и пробелов в содержимое строки.
Ответ 3
Я бы поставил все куски в таблицу и использовал table.concat
. Это позволяет избежать создания новых строк при каждой конкатенации. например (без учета накладных расходов для строк в Lua):
-- bytes used
foo="1234".. -- 4 = 4
"4567".. -- 4 + 4 + 8 = 16
"89ab" -- 16 + 4 + 12 = 32
-- | | | \_ grand total after concatenation on last line
-- | | \_ second operand of concatenation
-- | \_ first operand of concatenation
-- \_ total size used until last concatenation
Как вы можете видеть, это быстро взрывается. Это лучше:
foo=table.concat{
"1234",
"4567",
"89ab"}
Что займет около 3 * 4 + 12 = 24 байта.
Ответ 4
Вы пробовали
string.sub(s, я [, j]).
Вы можете посмотреть здесь:
http://lua-users.org/wiki/StringLibraryTutorial
Ответ 5
Это:
return "Bigggg string 1"\
"continuation of string"\
"continuation of string"\
"End of string"
Синтаксис C/С++ заставляет компилятор видеть все как одну большую строку. Он обычно используется для удобства чтения.
эквивалент Lua:
return "Bigggg string 1" ..
"continuation of string" ..
"continuation of string" ..
"End of string"
Обратите внимание, что синтаксис C/С++ является временем компиляции, тогда как эквивалент Lua, скорее всего, выполняет конкатенацию во время выполнения (хотя компилятор теоретически может его оптимизировать). Однако это не должно быть большой проблемой.