2012-03-20 100 views
3

逃逸字符串我读文件:为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

OK,%可以逃脱这样,如果设定第一在上面的 “表”,我只是纠正

:可怕的经历:

更新3

逃逸的^$

如Lua的手册中所述(5.15.25.3

在模式的始甲插入符^锚定匹配在对象字符串的开头。模式结尾处的$锚定主题字符串结尾的匹配。在其他位置,^$没有特殊含义并代表他们自己。

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

的Lua 5.1 - 5.2+不兼容性

string.gsub现在如果替换字符串包含%接着大于允许%或数字以外的字符引发错误。

没有必要在替换字符串中每%加倍。见lua-users

+0

要在变量中的Lua字符串中转义“模式”字符,请使用以下函数:https://github.com/lua-nucleo/lua-nucleo/blob/v0.1.0/lua-nucleo/string.lua# L245-L267 – 2012-03-20 21:19:31

回答

1

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

+0

谢谢,但由于某种原因仍然没有运气 – theta 2012-03-20 16:28:28

+1

这将工作,如果文件逐行阅读,而不是与'ss'相比,而不是'gsub' – theta 2012-03-20 18:12:39

2

尝试%

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

特殊字符转义和报价与\

+0

因为脚本中的's'是可变的,并不难编码的字符串,你可以提供更多的信息,哪些字符需要'gsub'逃脱?我做了函数将字符串转换为字节序列并作为解决方法,然后发现我无法告诉Lua将字节转换为除ASCII以外的字符串。 – theta 2012-03-20 20:40:23

+0

请参阅模式参考手册以确定需要转义的内容http://www.lua.org/manual/5.1/manual.html#5.4.1。在上面的例子中,parens和反斜杠是特殊字符,因为它们在模式匹配方案中用于确定特殊结构(捕获或指示特殊字符)。 – 2012-03-20 20:51:19

+0

如果您可以提供帮助,请参阅我的更新 – theta 2012-03-20 21:15:41

4

为什么不:

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

逃跑,然后gsub它扔掉?

2

根据Programming in 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 

它在Lua 5.3.2上工作(只进行了基本的测试)。不知道它是否可以与旧版本兼容。