2

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

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

我需要的(除非 Lua 已经有一个字符串替换功能)是一个转义 Lua正则表达式模式字符串的函数(除非 Lua 已经有一个转义则表达式模式函数)

我试图开始编写正确的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, "%.");
4

2 回答 2

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
于 2012-09-03T07:30:08.847 回答
1

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

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

%在使用 string in 之前使用前面的转义它们,gsub你就完成了。

为了更加确定,您可以手动设置一个带有方便的“普通”标志和必要部分字符串的while循环。string.findstring.sub

于 2012-09-02T15:15:57.550 回答