Использование string.gsub для наиболее эффективного изменения x на y (Lua)

Я в недоумении, хотя я все больше и больше знакомлюсь с gsub в Lua. Вероятно, есть лучший способ сделать это более эффективно, и это то, что я ищу. Что я хочу сделать, это изменить:

\(port Planes)9e;\(enter pool)n2euw

в

port Planes;run 9e;enter pool;run n2euw

Кажется, что это будет просто, но я совершенно ничего не понимаю. Возможно, я мог бы объяснить это отчасти истощением, но на самом деле это не оправдание. У меня было бы так:

string.gsub(variable, ";","\(")
string.gsub(variable, "\(", ";")
string.gsub(variable, ")",";run")
string.gsub(variable, ";;",";")

Но для меня это выглядит довольно небрежно и не так эффективно, как мне бы этого хотелось. Это также создает проблему, если «)» заканчивается строкой, а это ставит «;» там, чего я не хочу. Я был бы признателен за опыт кого-то, более знакомого с Lua, который может привести это в порядок и сделать его более эффективным. Я включу его в функцию, как только все будет сказано и сделано. Спасибо!

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


person Josh    schedule 09.10.2011    source источник
comment
Есть ли причина, по которой эффективность вызывает беспокойство?   -  person Nicol Bolas    schedule 10.10.2011
comment
Я полагаю, более быстрая компиляция кода. Кроме того, это облегчает просмотр в будущем, поэтому я не смотрю на это позже и не думаю: «Что, черт возьми, я здесь пытался?» Конечный результат, который я ищу, - это просто более аккуратный способ сделать это; это поможет мне и в будущих проектах, так как я все еще изучаю Lua.   -  person Josh    schedule 10.10.2011
comment
Не забывайте, что строки неизменяемы, поэтому вам нужно запомнить результат каждого вызова string.gsub: variable = string.gsub(variable, ";;",";"). Я также сэкономил бы время на наборе текста и написал бы его как variable = variable:gsub(";;",";"), пока я был уверен, что variable всегда равно string.   -  person RBerteig    schedule 10.10.2011


Ответы (1)


Не зная больше о возможных комбинациях, которые вы могли бы иметь, я не могу сказать, что это будет работать в каждом случае, но это должно дать начало:

string.gsub(variable,"\\%((.-)%)","%1;run ")
string.gsub(variable,";run $","")

Первый gsub возвращает команды внутри ваших скобок, удаляя скобки и добавляя «; run» в конце.

Второй проверяет, является ли конец строки «;run», и заменяет его, если это так.

Вам также следует ознакомиться с этой статьей, где содержится хороший обзор шаблонов: http://www.lua.org/pil/20.2.html

person ChrisO    schedule 10.10.2011
comment
Это делает вещи намного аккуратнее. Я действительно ничего не понял, и я ценю ваш ответ! - person Josh; 10.10.2011