转义gsub的字符串

the*_*eta 6 lua gsub

我读了一个文件:

local logfile = io.open("log.txt", "r")
data = logfile:read("*a")
print(data)
Run Code Online (Sandbox Code Playgroud)

输出:

...
"(\.)\n(\w)", r"\1 \2"
"\n[^\t]", "", x, re.S
...
Run Code Online (Sandbox Code Playgroud)

是的,logfile看起来很糟糕,因为它充满了各种命令

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

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

s='"(\.)\n(\w)", r"\1 \2"'
data=data:gsub(s, '')
Run Code Online (Sandbox Code Playgroud)

我想有些逃避需要完成.任何简单的方案?


更新:

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), ''))
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,只有我需要转义,转义字符%,因为如果%在匹配的字符串中它不会工作.我想:gsub('%%', '%%%%')还是:gsub('\%', '\%\%'),但它不工作.


更新2:

好的,%如果在我刚刚更正的"表格"中首先设置,可以通过这种方式进行转义

:可怕的经历:

更新3:

逃避^和逃避$

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

^模式开头的插入符号锚定主题字符串开头的匹配.$模式结尾处的A 锚定主题字符串末尾的匹配.在其他位置,^$没有特殊的含义,代表自己.

所以更好的想法是逃避^,$只有当它们被发现(分别)和字符串的开头或结尾时.

Lua 5.1 - 5.2+不兼容性

string.gsub如果替换字符串包含%后跟除allowed %或digit 之外的字符,则会引发错误.

%替换字符串中不需要加倍.见lua-users.

FSM*_*axB 8

根据Lua编程:

The character `%´ works as an escape for those magic characters. So, '%.' matches a dot; '%%' matches the character `%´ itself. You can use the escape `%´ not only for the magic characters, but also for all other non-alphanumeric characters. When in doubt, play safe and put an escape.

这是不是意味着您可以简单地放在%每个非字母数字字符前面并且没问题.这也是将来的证明(在引入新的特殊字符的情况下).像这样:

function escape_pattern(text)
    return text:gsub("([^%w])", "%%%1")
end
Run Code Online (Sandbox Code Playgroud)

它在Lua 5.3.2上为我工作(仅进行了基本测试).不确定它是否适用于旧版本.


Qix*_*Qix 6

为什么不:

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

逃跑然后gsub它走了吗?


lhf*_*lhf 2

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