Заменить каждое "с \" в Lua - PullRequest
0 голосов
/ 26 февраля 2019

X-Problem : Я хочу вывести весь lua-скрипт в одну строковую строку, которая впоследствии может быть скомпилирована в C-программу.

Y-проблема : Как вы можете заменить каждые " на \"?

Я думаю, что имеет смысл попробовать что-то подобное

data = string.gsub(line, "c", "\c")где c является символом ".Но это, конечно, не работает.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Решение вашей X-проблемы состоит в том, чтобы безопасно избежать любой последовательности, которая может помешать интерпретатору.

У Lua есть опция %q для string.format , который будет форматировать и экранировать предоставленную строку таким образом, что Lua сможет безопасно ее прочитать.Это также должно быть верно для вашего интерпретатора C.


Пример строки: This \string's truly"tricky

Если вы просто заключите его в одинарные или двойные кавычки, все равно будетцитата, которая рано завершила строку.Также есть недопустимая escape-последовательность \s.

Представьте себе, что эта строка уже правильно обработана в Lua, поэтому мы просто передадим ее в качестве параметра: string.format("%q", 'This \\string\'s truly"tricky')

возвращает (уведомление,Я использовал одинарные кавычки при вводе кода):

"This \\string's truly\"tricky"

Теперь это полностью допустимая строка Lua, которую можно записывать и читать из файла.Не нужно вручную избегать каждого специального символа и рисковать ошибками реализации.


Чтобы правильно реализовать ваш подход Y , чтобы экранировать (недопустимые) символы с \, используйте правильное сопоставление с шаблоном для замены захваченной строки на префикс + захваченная строка:

string.gsub('he"ll"o', "[\"']", "\\%1") -- will prepend backslash to any quote

0 голосов
/ 26 февраля 2019

Вам нужно экранировать кавычки и обратную косую черту, если я понимаю вашу проблему с Y:

data = string.gsub(line, "\"", "\\\"")

или использовать другие одинарные кавычки (по-прежнему экранировать обратную косую черту):

data = string.gsub(line, '"', '\\"')
...