2011-06-05 232 views
2

我想匹配一些字符串和幾個數字。 的線條能像Lua string.match()問題

" Code            : 75.570 " 

" ..dll         :   13.559  1" 

" ..node         : 4.435 1.833 5461" 

" ..NavRegions          : 0.000   " 

我想是這樣

local name, numberLeft, numberCenter, numberRight = line:match("regex"); 

但我很新的字符串匹配。

+0

一個問題:名稱的字符串是否在前面總是有零個或兩個句點,而字符串的其餘部分是字母? – 2011-06-05 15:56:05

+0

行首有兩個空格字符,名稱跟在後面,並且還有空格字符,冒號和1或2或3個數字(末尾之間再次包含未知數量的空格字符,空格字符或不是,這真的很複雜,有人比字符串匹配或者解決方法有更好的想法嗎? – luac 2011-06-05 16:02:25

+0

因爲Lua沒有包含正則表達式庫,所以被重新標記。有關Lua模式匹配的更多細節,請參見http://www.lua.org /pil/20.2.html – BMitch 2011-06-05 18:24:29

回答

1

這裏是一個起點:

s=" ..dll         :   13.559  1" 
for w in s:gmatch("%S+") do 
     print(w) 
end 

您可以在一個表中,而不是打印保存這些話,當然。並跳過第二個單詞。

0

我不理解Lua語言,所以我不會幫你。 但在Java這個表達式應該匹配你的輸入

"([a-z]*)\\s+:\\s+([\\.\\d]*)?\\s+([\\.\\d]*)?\\s+([\\.\\d]*)?"

你要測試每個組知道是否有數據左,中,右

在看看Lua,它可能看起來像這個。沒有保證,我沒有看到如何逃脫.(點),這有一個特殊的含義,也不是如果?可用於Lua。

"([a-z]*)%s+:%s+([%.%d]*)?%s+([%.%d]*)?%s+([%.%d]*)?"

+0

這看起來非常接近,但如果我正確地解析它,你至少需要兩個數字。不應該有另一個數字分組有一個'?'...而且也不會對這些分組使用'(\\ d * \\。?\\ d *)'更好,以使匹配更加精確? – 2011-06-05 17:47:28

+0

使用'%.'作爲轉義字符。'' – BMitch 2011-06-05 18:26:26

+0

@Blak爲缺少'?'確實是'(\\ d * \\。?\\ d *)'更精確。 – millebii 2011-06-05 18:36:26

5

此圖案將每情況下工作:

%s*([%w%.]+)%s*:%s*([%d%.]+)%s*([%d%.]*)%s*([%d%.]*)

簡短說明:[]使得一組字符的(例如,小數)。最後的數字使用[set]*,所以空匹配也是有效的。這樣,尚未找到的號碼將被有效地分配給nil

請注意使用+-*的模式之間的差異。更多關於模式in the Lua reference

這將匹配點和小數點的任意組合,所以嘗試將其轉換爲tonumber()之後的數字可能會很有用。

一些測試代碼:

s={ 
" Code            : 75.570 ", 
" ..dll         :   13.559  1", 
" ..node         : 4.435 1.833 5461", 
" ..NavRegions          : 0.000   " 
} 
for k,v in pairs(s) do 
    print(v:match('%s*([%w%.]+)%s*:%s*([%d%.]+)%s*([%d%.]*)%s*([%d%.]*)')) 
end 
1

@Ihf謝謝你,我現在有一個可行的解決方案。

local moduleInfo, name = {}; 
for word in line:gmatch("%S+") do 
    if (word~=":") then 
     word = word:gsub(":", ""); 
     local number = tonumber(word); 
     if (number) then 
      moduleInfo[#moduleInfo+1] = number; 
     else 
      if (name) then 
       name = name.." "..word:gsub("%$", ""); 
      else 
       name = word:gsub("%$", ""); 
      end 
     end 
    end 
end 

@jpjacobs非常好,謝謝。我會重寫我的代碼,因爲綜合的原因;-)我會實現你的正則表達式當然。