У меня есть что-то вроде
str = "What a wonderful string //011// this is"
Мне нужно заменить //011// на что-то вроде convertToRoman(011), а затем получить
str = "What a wonderful string XI this is"
Однако преобразование в римские числа здесь не проблема.
Также возможно, что в строке str не было //...//. В этом случае он должен просто вернуть ту же строку.
function convertSTR(str)
if not string.find(str,"//") then
return str
else
replace //...// with convertToRoman(...)
end
return str
end
Я знаю, что могу использовать string.find, чтобы получить полную последовательность \\...\\. Есть ли более простое решение с сопоставлением с образцом или чем-то похожим?





string.gsub принимает функцию в качестве замены. Итак, это должно работать
new = str:gsub("//(.-)//", convertToRoman)
Мне нравится LPEG, поэтому вот решение с LPEG:
local lpeg = require"lpeg"
local C, Ct, P, R = lpeg.C, lpeg.Ct, lpeg.P, lpeg.R
local convert = function(x)
return "ROMAN"
end
local slashed = P"//" * (R("09")^1 / convert) * P"//"
local other = C((1 - slashed)^0)
local grammar = Ct(other * (slashed * other)^0)
print(table.concat(grammar:match("What a wonderful string //011// this is"),""))