为gsub转义字符串

我读取了一个文件:

local logfile = io.open("log.txt", "r")
data = logfile:read("*a")
print(data)

输出:

...
"(\.)\n(\w)", r"\1 \2"
"\n[^\t]", "", x, re.S
...

是的,日志文件看起来很糟糕,因为它充满了各种命令。

我如何调用 gsub 并从数据变量中删除 "(\.)\n(\w)", r"\1 \2" 行?

下面的代码片段不起作用:

s='"(\.)\n(\w)", r"\1 \2"'
data=data:gsub(s, '')

我猜需要进行一些转义。有没有简单的解决方案?


更新

local data = [["(\.)\n(\w)", r"\1 \2"
"\n[^\t]", "", x, re.S]]

local s = [["(\.)\n(\w)", r"\1 \2"]]

local function esc(x)
   return (x:gsub('%%', '%%%%')
            :gsub('^%^', '%%^')
            :gsub('%$$', '%%$')
            :gsub('%(', '%%(')
            :gsub('%)', '%%)')
            :gsub('%.', '%%.')
            :gsub('%[', '%%[')
            :gsub('%]', '%%]')
            :gsub('%*', '%%*')
            :gsub('%+', '%%+')
            :gsub('%-', '%%-')
            :gsub('%?', '%%?'))
end

print(data:gsub(esc(s), ''))

这似乎可以正常运行,只是我需要转义转义字符 %,因为如果 % 在匹配的字符串中,它将不起作用。我尝试了 :gsub('%%', '%%%%'):gsub('\%', '\%\%'),但它不起作用。


更新 2

好的,如果在上面的“表格”中首先设置 %,那么就可以以这种方式转义 %

:可怕的经验:

更新 3

^_和$的转义

如 Lua 手册所述(5.1, 5.2, 5.3):

符号 ^ 在模式开头锚定匹配在主题字符串的开头。符号 $ 在模式的末尾锚定匹配在主题字符串的末尾。在其他位置,^$ 没有特殊意义,并且表示它们自己。

因此更好的做法是仅在字符串开始或结束时找到时转义 ^$

Lua 5.1 - 5.2+ 不兼容

如果替换字符串以除允许的 % 或数字之外的字符为 % 的字符开头,string.gsub 现在会引发错误。

无需在替换字符串中将每个 % 倍增。请参阅 lua-users.

原文链接 https://stackoverflow.com/questions/9790688

点赞
stackoverflow用户107090
stackoverflow用户107090

尝试使用 s=[["(\.)\n(\w)", r"\1 \2"]]

2012-03-20 16:22:23
stackoverflow用户1208078
stackoverflow用户1208078

尝试

line = '"(\.)\n(\w)", r"\1 \2"'
rx = '\"%%(%%\.%%)\n%%(%%\w%%)\", r\"%%\1 %%\2\"'
print(string.gsub(line, rx, ""))

使用 % 转义特殊字符,使用 \ 转义引号。

2012-03-20 20:24:55
stackoverflow用户510036
stackoverflow用户510036

为什么不这样做:

local quotepattern = '(['..("%^$().[]*+-?"):gsub("(.)", "%%%1")..'])'
string.quote = function(str)
    return str:gsub(quotepattern, "%%%1")
end

对字符串进行转义,然后再使用 gsub 来替换掉它?

2013-12-26 03:25:20
stackoverflow用户1717115
stackoverflow用户1717115

根据Programming in Lua

字符“%”可以用作那些特殊字符的转义字符。 因此,“'.'”匹配一个点;“'%%'”匹配字符“%”本身。 您不仅可以使用转义字符“%”来匹配特殊字符,还可以使用它来匹配所有其他非字母数字字符。 如果有疑问,请采取安全措施并进行转义。

这是否意味着您可以在每个非字母数字字符前面放置“%”并且可以正常工作? 这也将是未来更为保险(如出现新的特殊字符)。 就像这样:

function escape_pattern(text)
    return text:gsub("([^%w])", "%%%1")
end

它在Lua 5.3.2上对我起作用(只进行了基本测试)。 不确定它是否适用于较旧的版本。

2016-01-22 18:34:26
stackoverflow用户1247192
stackoverflow用户1247192

使用 Penlight Lua 库中的 stringx.replace() 代替。

参考: https://stevedonovan.github.io/Penlight/api/libraries/pl.stringx.html#replace

实现 (v1.12.0): https://github.com/lunarmodules/Penlight/blob/1.12.0/lua/pl/stringx.lua#L288

基于他们的实现:

function escape(s)
    return (s:gsub('[%-%.%+%[%]%(%)%$%^%%%?%*]','%%%1'))
end

function replace(s,old,new,n)
    return (gsub(s,escape(old),new:gsub('%%','%%%%'),n))
end
2022-06-18 01:56:20