2010-10-17 69 views
2

我是Lua的新手。Lua中的n位數字模式匹配

說我有一個字符串 「1234567890」。

我想遍歷所有可能的3位數字。 (即123,234,345,456....

for m in string.gmatch("1234567890","%d%d%d") do 
     print (m) 
end 

但是這給了我輸出123,456,789

我應該使用什麼樣的格局?

其次,一個相關的問題,我怎麼指定3-digit多少? "%3d"似乎不起作用。唯一的辦法是"%d%d%d"

注意:這沒有標籤Regular expression,因爲Lua沒有RegExp。 (ATLEAST本身)

感謝提前:)

更新:琥珀指出的,是在Lua沒有 「重疊」 相匹配。並且,關於第二個查詢,我現在使用string.rep("%d",n)卡住了,因爲Lua不支持固定的重複次數。

+1

'( 「%d」):代表(N)'是寫調用'函數string.rep稍微更慣用的方式'。它的工作原理是因爲'string'默認情況下是所有字符串值的元表單。 – RBerteig 2010-10-17 22:03:32

回答

3

gmatch永不返回重疊匹配(並且gsub從不會替換重疊的匹配,fwiw)。

您最好的選擇很可能是通過所有可能的長度爲3的子迭代,每次檢查,看看他們是否匹配一個3位數的方式,如果是這樣,對它們進行操作。

(是的,%d%d%d是寫它的唯一途徑。Lua的縮寫模式的支持沒有一個固定數量的,重複的語法。)

+0

謝謝,這很不幸!你對簡單的n位數模式有什麼想法嗎? :) – st0le 2010-10-17 07:23:27

+0

嘿,當我編輯我的答案提及時,Lua的簡單模式匹配沒有更簡單的語法。 – Amber 2010-10-17 07:24:28

+0

我已經完成了...... :)但我想也許我應該去更多的「Lua-ish」解決方案。 :) – st0le 2010-10-17 07:24:34

4

這一核心Lua中沒有寫清你是正確的常用表達。 string模塊可以理解的模式更簡單,但對於很多情況已足夠。不幸的是,匹配重疊的n位數字不是其中之一。

這就是說,你可以手動遍歷字符串的長度,並在每個位置嘗試匹配,因爲string.match函數接受一個起始索引。例如:

 
s = "1234567890" 
for i=1,#s do 
    m = s:match("%d%d%d", i) 
    if m then print(m) end 
end 

這將產生以下輸出:

 
C:>Lua 
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio 
> s = "1234567890" 
> for i=1,#s do 
>>  m = s:match("%d%d%d", i) 
>>  if m then print(m) end 
>> end 
123 
234 
345 
456 
567 
678 
789 
890 
>