Lua: замена символов в строке

у меня такие строки

abcdef
abcd|(
abcde|(foo 
abcd|)
abcde|)foo

который следует изменить на

abcdef
abcd
abcde \foo 
abcd
abcde \foo 
  • если нет | то ничего не делать
  • если после |( или |) ничего не следует, удалите эти два символа
  • если что-то следует, замените |( или |) на <space>\

Меня интересуют короткие шаблонные выражения, если это возможно. Я могу сделать это с помощью нескольких string.find и string.sub, но тогда у меня будет много операторов if.


person Red-Cloud    schedule 03.10.2018    source источник
comment
Вы имеете в виду позицию в конце строки с if nothing follows?   -  person Wiktor Stribiżew    schedule 03.10.2018
comment
Да, тогда |( или |) являются последними символами. Если | нет, то bar) должно остаться без изменений   -  person Red-Cloud    schedule 03.10.2018
comment
Тогда мое решение должно работать.   -  person Wiktor Stribiżew    schedule 03.10.2018


Ответы (1)


Вы можете использовать

function repl(v)
    res, _ = string.gsub(v:gsub('|[()]$', ''), '|[()]', ' \\')
    return res
end

См. демонстрацию Lua онлайн.

Подробнее

  • '|[()]$' соответствует |, а затем либо (, либо ) в конце строки, а string.gsub заменяет эти вхождения пустой строкой.
  • Затем |[()] соответствует |, а затем либо (, либо ) в любом месте в строке, а string.gsub заменяет эти вхождения пробелом и \.
person Wiktor Stribiżew    schedule 03.10.2018
comment
Упс, я только что понял, что я что-то забыл. Строка типа abcd|foo также возможна и должна быть изменена на abcd \foo. - person Red-Cloud; 04.10.2018
comment
@ Герберт Замените '|[()]' на '|[()]?' - person Wiktor Stribiżew; 04.10.2018