2016-03-06 36 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