Перейти к содержимому
  • 0
miner7

Убрать экранирование управляющих символов

Вопрос

Всем привет! Есть такая задача: на входе строка с экранированными управляющими символами: "Lorem ipsum \\n dolor sit amet", на выходе она должна быть такой "Lorem ipsum \n dolor sit amet". Как можно сделать это максимально компактно? Заранее благодарен)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

23 минуты назад, miner7 сказал:

@NEO , да, неправильно описал задачу, тут конкретно string. Есть ли вариант с ним?

Как я понял тебе нужно заменить \{char} на управляющий байт?

local someText = "Lorem ipsum \\n dolor sit amet"
local result = someText:gsub("\\(%w)", {
    a = "\a",
    b = "\b",
    f = "\f",
    n = "\n",
    r = "\r",
    t = "\t",
    v = "\v",
})

На данный момент я имею такое решение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
local result = string.gsub(someText, "\\\\(%w)", "\\%1") -- Первый вариант
local result = someText:gsub("\\\\(%w)", "\\%1") -- Второй вариант

Если быстро - то только так. Но нужно конвертировать управляющий символ в нужный байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@NEO , спасибо, а можно, пожалуйста, пример использования?) Подставлял вместо someText свою строку, выход идентичен входу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
20 минут назад, miner7 сказал:

@NEO , спасибо, а можно, пожалуйста, пример использования?) Подставлял вместо someText свою строку, выход идентичен входу.

https://www.lua.org/cgi-bin/demo

local someText = "Lorem ipsum \\\\n dolor sit amet"
print(someText)
print(string.gsub(someText, "\\\\(%w)", "\\%1"))

Вывод

Цитата

Lorem ipsum \\n dolor sit amet
Lorem ipsum \n dolor sit amet    1

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, miner7 сказал:

Lorem ipsum \\n dolor sit amet

Тут неясно, данный текст является луашным стрингом или обычным текстом? Если луашный стринг - тогда мой код работать не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@NEO , да, неправильно описал задачу, тут конкретно string. Есть ли вариант с ним?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@NEO , спасибо большое за помощь)

Изменено пользователем miner7

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот полное решение.

local function processEscapes(str)
  return (str:gsub("\\u{(%x+)}", function(hex) return utf8.char(tonumber(hex, 16)) end)
  	:gsub("\\(%d%d?%d?)", function(dec) return string.char(tonumber(dec, 10)) end)
  	:gsub("\\x(%x%x)", function(hex) return string.char(tonumber(hex, 16)) end)
  	:gsub("\\z%s*", "") -- skip whitespace
    :gsub("\\\n", "\n")
    :gsub("\\([abfnrtv\\\"'])", {
      a = "\a",
      b = "\b",
      f = "\f",
      n = "\n",
      r = "\r",
      t = "\t",
      v = "\v",
      ["\\"] = "\\",
      ['"'] = '"',
      ["'"] = "'",
    }))
    :gsub("\\(.)", function(c) error("invalid escape sequence: \\" .. c) end)
end

P. S. Форум убивает форматирование, не спрашивая меня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, Fingercomp сказал:

Вот полное решение.


local function processEscapes(str)
  return (str:gsub("\\u{(%x+)}", function(hex) return utf8.char(tonumber(hex, 16)) end)
  	:gsub("\\(%d%d?%d?)", function(dec) return string.char(tonumber(dec, 10)) end)
  	:gsub("\\x(%x%x)", function(hex) return string.char(tonumber(hex, 16)) end)
  	:gsub("\\z%s*", "") -- skip whitespace
    :gsub("\\\n", "\n")
    :gsub("\\([abfnrtv\\\"'])", {
      a = "\a",
      b = "\b",
      f = "\f",
      n = "\n",
      r = "\r",
      t = "\t",
      v = "\v",
      ["\\"] = "\\",
      ['"'] = '"',
      ["'"] = "'",
    }))
    :gsub("\\(.)", function(c) error("invalid escape sequence: \\" .. c) end)
end

P. S. Форум убивает форматирование, не спрашивая меня.

Половинку луа лексера скопировал. :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...