2016-08-10 7 views
2

В настоящее время у меня есть код, который выглядит следующим образом:Lua Pattern Matching, получить символ перед матчем

somestring = "param=valueZ&456" 
local stringToPrint = (somestring):gsub("(param=)[^&]+", "%1hello", 1) 

StringToPrint будет выглядеть следующим образом:

param=hello&456 

Я заменил все символы перед & со строкой «привет». Здесь мой вопрос становится немного странным и конкретным.

Я хочу, чтобы моя строка отображалась как: param=helloZ&456. Другими словами, я хочу сохранить символ прямо перед & при замене строки valueZ на hello, чтобы сделать ее helloZ. Как это может быть сделано?

+0

Каков ожидаемый результат для '" param = valueZ & param = 456 "'? Или этого не может быть? Попробуйте 'somestring: gsub (" (param =) [^ &] + ([^ &]) ","% 1hello% 2 ", 1)', см. Http://ideone.com/pHRgAT –

ответ

1

Я предлагаю:

somestring:gsub("param=[^&]*([^&])", "param=hello%1", 1) 

Смотрите Lua demo

Здесь шаблон совпадает:

  • param= - буквальный подстрока param=
  • [^&]* - 0 или больше символов, кроме & как можно больше
  • ([^&]) - Группа 1, захватывающая символ, отличный от & (здесь будет происходить обратный поиск, поскольку предыдущий шаблон захватывает все такие символы, кроме &, а затем двигатель сделает шаг назад и поместит последний символ из этого фрагмента в группу 1).
+0

Предположим, было ли это: 'param = a & xyz '? – hjpotter92

+0

@ WiktorStribiżew Ваша демонстрация работает, но предложение имеет '()' around param, так что оно не работает – Rochet2

+0

@ Rochet2: Я забыл удалить избыточную группу. Удалено сейчас. Я думаю, что если вы соответствуете строковой строке, вам не нужно добавлять накладные расходы. –

1

Есть, вероятно, и другие способы сделать это, но вот один:

somestring = "param=valueZ&456" 
local stringToPrint = (somestring):gsub("(param=).-([^&]&)", "%1hello%2", 1) 
print(stringToPrint) 

Дело в том, что я соответствовать самой короткой строки, которая заканчивается символом, который не & и символ, который & , Затем я добавляю два конечных символа в замененную часть.

+0

Спасибо! Просто любопытно, как вы могли бы это сделать, если бы мы хотели заменить все до конца строки (например, 'param = valueZ' на' param = helloZ'), а не до первого символа '&' – kshah

+0

@kshah. Вы имеете в виду ' (пары =) +. (.) "'? – Rochet2

+0

Ах да, точно .. я глуп. Спасибо! – kshah