在Lua中替换字符串

时间:2012-09-02 14:07:14

标签: lua replace

我希望在Lua中编写一个函数,用一个字符串替换所有出现的字符串,例如:

function string.replace(s, oldValue, newValue)
   return string.gsub(s, oldValue, newValue);
end;

我需要什么(除非Lua已经有一个字符串替换函数)是一个逃避Lua 正则表达式模式字符串的函数(除非Lua已经有一个Escape RegularExpression 模式函数)

我试图开始编写正确的string.replace函数:

local function EscapeRegularExpression(pattern)
    -- "." ==> "%."
    local s = string.gsub(pattern, "%." "%%%.");

    return s;
end;

function string.replace(s, oldValue, newValue)
    oldValue = EscapeRegularExpression(oldValue);
    newValue = EscapeRegularExpression(newValue);

    return string.gsub(s, oldValue, newValue);
end;

但我不能轻易想到所有需要转义的Lua 正则表达式模式关键字。

奖金示例

另一个需要修复的示例可能是:

//Remove any locale thousands separator:
s = string.gsub(s, Locale.Thousand, "");

//Replace any locale decimal marks with a period
s = string.gsub(s, Locale.Decimal, "%.");

2 个答案:

答案 0 :(得分:3)

我用

-- Inhibit Regular Expression magic characters ^$()%.[]*+-?)
function strPlainText(strText)
    -- Prefix every non-alphanumeric character (%W) with a % escape character, 
    -- where %% is the % escape, and %1 is original character
    return strText:gsub("(%W)","%%%1")
end -- function strPlainText

答案 1 :(得分:1)

查看有关模式的文档(Lua 5.1的section 5.4.1),最有趣的是魔术字符列表:

  

x :(其中x不是魔术字符之一^ $()%。[] * + - ?)   代表字符x本身。

在使用%中的字符串之前,先使用前一个gsub转义它们,然后就完成了。

要确保您可以设置while循环string.find,其中包含方便的“普通”标记和string.sub字符串的必要部分。