我希望在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, "%.");
答案 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
字符串的必要部分。