2016-01-13 125 views
2

我想使用lua解析文本文件并将结果存储在两个数组中。我认为我的模式是正确的,但这是我第一次做这类事情。Lua模式匹配问题

fileio.lua

questNames = {} 
questLevels = {} 
lineNumber = 1 

file = io.open("results.txt", "w") 
io.input(file) 

for line in io.lines("questlist.txt") do 
    questNames[lineNumber], questLevels[lineNumber]= string.match(line, "(%a+)(%d+)") 
    lineNumber = lineNumber + 1 
end 

for i=1,lineNumber do 
    if (questNames[i] ~= nil and questLevels[i] ~= nil) then 
    file:write(questNames[i]) 
    file:write(" ") 
    file:write(questLevels[i]) 
    file:write("\n") 
    end 
end 

io.close(file) 

这里的questlist.txt的一个小片段:

If the dead could talk16 Forgotten soul16 The Toothmaul Ploy9 Well-Armed Savages9

而这里的RESULTS.TXT的匹配片段:

talk 16 soul 16 Ploy 9 Savages 9

RESULTS.TXT后,我的是:

If the dead could talk 16 Forgotten soul 16 The Toothmaul Ploy 9 Well-Armed Savages 9

所以我的问题是,我该以选择所有文字多达数使用哪种模式?

谢谢你的时间。

回答

2

%a符合字母。它不符合空格。

如果您想匹配所有内容最多可包含一个您想要的数字序列(.-)(%d+)

如果你想匹配一个前导序列的非数字,那么你想要([^%d]+)(%d+)

这就是说,如果你只想在数字序列之前插入空格,那么你可以使用line:gsub("%d+", " %0", 1)来做到这一点(只为第一个匹配做一个空格,离开这个做为线上的每场比赛)。

顺便说一下,我不认为io.input(file)正在为您做任何有用的事情(或您可能期望的)。它将用文件句柄file替换默认的标准输入文件句柄。

+0

谢谢,'([^%d] +)(%d +)'是我所追求的。哦,我明白了,这是我第一次正确地使用lua,并且教程提到了它。我会把它拿出来。 –

+0

什么教程?它对此有何评论? –

+1

您可能是指'(.-)(%d +)'而不是'(。*)(%d +)'。 – lhf