Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua gsub的转义字符串_Lua_Gsub - Fatal编程技术网

Lua gsub的转义字符串

Lua gsub的转义字符串,lua,gsub,Lua,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"' d

我读了一个文件:

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

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), ''))
好的,
%
可以通过这种方式转义,如果在我刚刚更正的上面的“表”中先设置

:可怕的经历:

更新3

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), ''))
转义
^
$

如Lua手册(,)所述

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

因此,更好的方法是仅在找到
^
$
以及字符串的开头或结尾时才转义它们

Lua 5.1-5.2+不兼容性

string.gsub
现在,如果替换字符串包含一个
%
后跟一个除允许的
%
或数字以外的字符,则会引发错误

替换字符串中的每个
%
不需要加倍。请参阅。

尝试
s=[[“(\)\n(\w)”,r“\1\2”]
尝试

line = '"(\.)\n(\w)", r"\1 \2"'
rx =  '\"%(%\.%)%\n%(%\w%)\", r\"%\1 %\2\"'
print(string.gsub(line, rx, ""))
用%转义特殊字符,用\

转义引号为什么不:

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

根据:


角色“%”作为这些魔法角色的转义。所以,“%”匹配一个点;“%”匹配字符“%%”本身。您不仅可以将转义“%”用于魔法字符,还可以用于所有其他非字母数字字符。当有疑问时,要小心行事,并放人逃生。

这难道不意味着你可以简单地把
%
放在每个非字母数字字符的前面就可以了吗。这也是未来的证明(在引入新的特殊字符的情况下)。像这样:

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

它在Lua5.3.2上对我有效(只进行了初步测试)。不确定它是否适用于较旧的版本。

谢谢,但由于某些原因,仍然不太可能。如果文件是逐行读取的,并且与s相比,逐行读取,但不适用于
gsub
,因为
s
在我的脚本中是可变的,而不是硬编码字符串,那么这将起作用。您能否提供更多信息,说明
gsub
需要转义哪些字符?作为一种解决方法,我创建了将字符串转换为字节序列再转换回来的函数,但后来发现,除了ASCII之外,我无法告诉Lua将字节转换为字符串。请参阅模式参考手册,以确定需要转义的内容。在上述情况下,Paren和反斜杠是特殊字符,因为它们在模式匹配方案中用于确定特殊构造(捕获或指示特殊字符)。要转义变量中Lua字符串中的“模式”字符,请使用以下函数: