Lua: шаблон(ы) string.gsub для разрешения множественной замены шаблона

Ранее эта тема частично обсуждалась другим пользователем в ветке: строка Lua. gsub с несколькими шаблонами

У меня проблемы, и я считаю, что это мой шаблон (второй) аргумент. Вот мой пример кода gsub, который я пытаюсь использовать:

local dateCode = "MMM/dd-YYYY:ss"

--dateCode = dateCode:gsub(".*", {["%/"] = "s", ["%-"] = "n", ["%:"] = "c"}) --original code but removed after @Etan's comments.
dateCode = dateCode:gsub(".*", {["/"] = "s", ["-"] = "n", [":"] = "c"})

print(dateCode)

MMM/dd-YYYY:ss  --printed

MMMsddnYYYYcss  --desired

Я считаю, что мне не следует просматривать все символы, как у меня сейчас, но я не уверен, какой шаблон мне следует использовать для переменной dateCode. Идея состоит в том, чтобы заменить ключи первым альфа-символом, с которого он начинается.


person Pwrcdr87    schedule 13.11.2015    source источник
comment
Каков ваш желаемый результат здесь? MMMsddnYYYYcss? Ключи в замене gsub должны быть равны захваченным битам строки, которой соответствует шаблон. У вас нет % в вашем вводе, поэтому ни один из ваших ключей не может совпадать.   -  person Etan Reisner    schedule 13.11.2015
comment
@EtanReisner, ты прав. Это желаемый результат. Я ошибочно использовал % в качестве escape-символов в своих ключах. Спасибо. После удаления по-прежнему не дает желаемого результата.   -  person Pwrcdr87    schedule 13.11.2015
comment
Подумайте о том, что вы сочетаете со своим рисунком. Каков будет результат матча? Это то, что gsub ищет в аргументе таблицы. Поэтому, если вы хотите заменить только эти символы, вам нужно индивидуально сопоставить только эти символы.   -  person Etan Reisner    schedule 13.11.2015
comment
@EtanReisner UGHH..... спасибо, что вытащили это из меня. %p...... Я обновлю свой пост, чтобы показать правильный шаблон.   -  person Pwrcdr87    schedule 13.11.2015
comment
Не обновляйте пост. Если у вас есть решение, добавьте ответ и примите его.   -  person Etan Reisner    schedule 13.11.2015
comment
@EtanReisner, как всегда, большое спасибо!   -  person Pwrcdr87    schedule 13.11.2015


Ответы (1)


Поскольку вы хотите заменить выбранный набор символов, поместите их в набор символов в качестве шаблона:

dateCode = dateCode:gsub("[/:-]", {["/"] = "s", ["-"] = "n", [":"] = "c"})

Что происходит в настоящее время, так это то, что с шаблоном .* он соответствует всей строке. Поскольку строка "MMM/dd-YYYY:ss" не имеет проиндексированного значения в хеш-таблице (второй аргумент), замены фактически не происходит.

person hjpotter92    schedule 13.11.2015
comment
Спасибо hjpotter. Я использовал следующие dateCode:gsub("%p", {["/"] = "s", ["-"] = "n", [":"] = "c"}), и это сработало. Каковы будут последствия, если я сделаю это по-моему, а не по тому, как вы только что написали? Ааа... Я понял твое объяснение!!! Спасибо. - person Pwrcdr87; 13.11.2015
comment
%p охватывает гораздо больше символов. Он также будет включать такие символы, как +, ! и т. д. Хотя это не повлияет на производительность (или вывод), я бы предложил использовать более жесткое ограничение в шаблоне gsub. Если вы уверены в том, что хотите, используйте именно это. - person hjpotter92; 13.11.2015