2012-03-20 105 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上工作(只進行了基本的測試)。不知道它是否可以與舊版本兼容。