Lua: 替换子字符串

我有一个类似于

str = "What a wonderful string //011// this is"

的字符串,我需要用类似于convertToRoman(011)的东西替换//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来获取完整的\\...\\序列。有没有更简单的解决方案或类似的模式匹配?

点赞
用户107090
用户107090

string.gsub 接受一个函数作为替换。所以,这应该可以工作

new = str:gsub("//(.-)//", convertToRoman)
2018-11-21 11:50:46
用户1944004
用户1944004

我喜欢 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"),""))

注:LPEG 是一种用于创建基于模式的语法分析器的工具库。

2018-11-22 03:10:24