转义gsub的字符串

时间:2012-03-20 16:18:14

标签: 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
...

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

如何调用gsub并从数据变量中移除ie "(\.)\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.15.25.3

  

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

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

Lua 5.1 - 5.2+不兼容

  如果替换字符串包含string.gsub后跟除了允许的%或数字之外的字符,

%现在会引发错误。

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

4 个答案:

答案 0 :(得分:6)

为什么不:

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

逃跑,然后gsub离开?

答案 1 :(得分:5)

根据Programming in Lua

$(function() { var $radioButtons = $('.radio input[type="radio"]'); $radioButtons.click(function() { $('.radio input[type="radio"]').not(':checked').parent('label').removeClass('selected'); $(this).closest('label').addClass('selected'); }); });

这并不意味着你可以简单地将 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. 放在每个非字母数字字符的前面并且没问题。这也是将来的证明(在引入新的特殊字符的情况下)。像这样:

%

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

答案 2 :(得分:2)

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

使用%转义特殊字符,使用\

转义引号

答案 3 :(得分:1)

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