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字符串中的“模式”字符,请使用以下函数: