специальная замена lua gsub, выдающая неверный индекс захвата - PullRequest
2 голосов
/ 17 октября 2011

У меня есть фрагмент кода lua (выполняется в Corona):

local loginstr = "emailAddress={email} password={password}"
print(loginstr:gsub( "{email}", "tester@test.com" ))

Этот код генерирует ошибку:

недопустимый индекс захвата

Хотя теперь я знаю,это из-за того, что фигурные скобки не указаны надлежащим образом в шаблоне gsub, я не знаю, как это исправить.

Как мне сформировать шаблон gsub, чтобы я мог заменить строку-заполнитель электронной почтойзначение адреса?

Я осмотрел все сайты, ориентированные на lua, которые я могу найти, но большая часть документации вращается вокруг несвязанных ситуаций.

Ответы [ 2 ]

5 голосов
/ 17 октября 2011

Как я уже говорил в комментариях выше, когда электронное письмо закодировано как параметр URL,% 40, используемый для кодирования символа '@', будет использоваться в качестве индекса захвата.Поскольку шаблон поиска не имеет никаких захватов (не говоря уже о 40 из них), это вызовет проблему.

Существует два возможных решения: вы можете либо декодировать закодированную строку, либо кодировать вашу строку замены вэкранируйте символ '%' в нем.В зависимости от того, что вы собираетесь делать с конечным результатом, вам может потребоваться выполнить оба действия.

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

function url_decode(str)
  str = string.gsub (str, "+", " ")
  str = string.gsub (str, "%%(%x%x)",
      function(h) return string.char(tonumber(h,16)) end)
  str = string.gsub (str, "\r\n", "\n")
  return str
end

Для экранирования символа% в строке str, вы можете использовать:

str:gsub("%%", "%%%%")

Символ '%' экранируется как '%%', и ему необходимобыть добавленным как в шаблон поиска, так и в шаблон замены (следовательно, количество символов% в замене).

3 голосов
/ 17 октября 2011

Вы уверены, что ваша проблема не в том, что вы пытаетесь gsub на loginurl вместо loginstr?

Ваш код дает мне эту ошибку (см. http://ideone.com/wwiZk):

lua: prog.lua:2: attempt to index global 'loginurl' (a nil value)

и это звучит похоже на то, что вы видите. Просто исправьте это, чтобы использовать правильную переменную:

print(loginstr:gsub( "{email}", "tester@test.com" ))

говорит (см. http://ideone.com/mMj0N):

emailAddress=tester@test.com password={password}

по желанию.

...