2016-03-06 38 views
2

我需要使用特定模式“ - ”拆分输入文件的每一行。我离解决方案还不太远,但是我的代码实际上也分裂了单个空间。该文件的每一行的格式如下:使用特定模式的Lua拆分字符串

NAME - ID - USERNAME - GROUP NAME - GROUP ID - TIMESTAMP

名称字段可以有空格,同组名和时间,例如一排像

LUCKY STRIKE - 11223344 - @lucky - CIGARETTES SMOKERS - 44332211 - 11:42 may/5th

是有效的。 所以这些标记值应该存储在一个表内。 这里是我的代码:

local function splitstring(inputstr) 
    sep = "(%s-%s)" 
    local t={} ; i=1 
    for str in string.gmatch(inputstr, "([^"..sep.."]+)") do 
     t[i] = str 
     i = i + 1 
    end 
    print("=========="..t[1].."===========") 
    print("=========="..t[2].."===========") 
    print("=========="..t[3].."===========") 
    return t 
end 

当我运行它,把“幸运”的第一场,罢工第二场,第三场里面的ID。 有没有办法在第一个字段中存储“幸运打击”,只通过指定的模式解析? 希望你们能帮助我。

p.s.我已经看到了lua手册,但没有太多帮助我......

+1

't = {inputstr:gsub('%s +% - %s +','\ 0'):match(('.-(%Z +)'):rep(6))}' –

回答

2

你有什么问题。

首先,-是在Lua模式的重复符号: http://www.lua.org/manual/5.2/manual.html#6.4.1

您需要使用%-获得文字-

我们没有完成:由此产生的gmatch呼叫是string.gmatch(inputstr, "[^%s%-%s]+")。由于您的分隔符模式在[]内,因此它是一个字符类。它说:“给我所有不是空间或 - 的东西,并尽可能地贪婪”,这就是为什么它停在第一个空间角色。

最好的办法是做这样的事情:

local function splitstring(inputstr) 
    sep = "%-" 
    local t={} ; i=1 
    for str in string.gmatch(inputstr, "[^"..sep.."]+") do 
     t[i] = str 
     i = i + 1 
    end 
    print("=========="..t[1].."===========") 
    print("=========="..t[2].."===========") 
    print("=========="..t[3].."===========") 
    return t 
end 

其中产量:

==========LUCKY STRIKE =========== 
========== 11223344 =========== 
========== @lucky =========== 

...而现在独立围绕固定的值空间的问题。

+0

此页面来自本手册给出了一系列关于如何从字符串末尾修剪空格的示例:http://lua-users.org/wiki/StringTrim –

+0

查看刚才回复的评论? –

4

这里是另一个看法:

s="LUCKY STRIKE - 11223344 - @lucky - CIGARETTES SMOKERS - 44332211 - 11:42 may/5th"  
s=s.." - " 
for v in s:gmatch("(.-)%s+%-%s+") do 
    print("["..v.."]") 
end 

模式反映了字段的定义:一切直到-用空格包围。这里的“所有内容”都是使用非贪婪模式.-实现的。为了使这个工作一致,我们在末尾添加分隔符。许多使用分隔符的模式匹配问题可以从这种一致性中受益。

+1

解释如何工作的加分点,因此OP不必让你为他编写他所有的Lua模式代码:P –

+0

@ChrisKitching,够公平的。我已经添加了一些解释。感谢您的推动。 – lhf