2011-06-03 23 views
0

下面是我的模式,它對給定的字符串正常工作。當最後一行中缺少0時,Lua模式無法正常工作

local tempRec = [[ 

ABC01-USD-0322-A Total DUE amount : 2312.08 USD 
Value Date : 31 MAY  2011 
    Details:ABCDE - BCD:/ABC01 0212 23.79/ARM01 0311 870.79 
    Details:FGHIJ - BCD:/ABC01 0323 1.88 
    Details:KLMNO - BCD:/ABC01 0314 1,035.99 
    Details:PQRST - BCD:/ABC01 0315 677.61 
    Details:UVWXY - BCD:/ABC01 0316 362.75 
    Details:ZABCD - BCD:/ABC01 0317 0.28 

    ]] 

paytternToMatch = "(%w%w%w[%w%d][%w%d]%-.-%d%p%d%d\n)\n[\n]*" 

for w in string.gmatch(tempRec, paytternToMatch) do 
     print(w) 
end 

但是,當我從下面的mentioed字符串的最後一行中刪除0。該模式不匹配。任何幫助都會被理解。

local tempRec = [[ 

ABC01-USD-0322-A Total DUE amount : 2312.08 USD 
Value Date : 31 MAY  2011 
    Details:ABCDE - BCD:/ABC01 0212 23.79/ARM01 0311 870.79 
    Details:FGHIJ - BCD:/ABC01 0323 1.88 
    Details:KLMNO - BCD:/ABC01 0314 1,035.99 
    Details:PQRST - BCD:/ABC01 0315 677.61 
    Details:UVWXY - BCD:/ABC01 0316 362.75 
    Details:ZABCD - BCD:/ABC01 0317 .28 

    ]] 
paytternToMatch = "(%w%w%w[%w%d][%w%d]%-.-%d%p%d%d\n)\n[\n]*" 

for w in string.gmatch(tempRec, paytternToMatch) do 
     print(w) 
end 

感謝

+0

什麼是你想從該字符串中提取? – lhf 2011-06-03 12:51:27

回答

1

簡短的回答是,標點前的數字是不是在你的模式可選。只需添加一個*以匹配儘可能多的數字,但不允許有數字。如果您只想匹配單個數字或無數字,但在此之前沒有任何其他數字,則另一種選擇是使用?

paytternToMatch = "(%w%w%w[%w%d][%w%d]%-.-%d*%p%d%d\n)\n[\n]*" 
--          ^here 

請注意,除此之外,您還可能需要考慮其他幾項改進。例如,這將完全忽略數字自上次.-將包括它,改變標點只允許一個.,並改變換行要求有點:

paytternToMatch = "(%w%w%w[%w%d][%w%d]%-.-%.%d%d\n)\n+" 

用於上的圖案更詳細地參見Programming in Lua

+0

@B米奇,看來你的答案工作正常。我會根據你提供的模式做更多的測試。我必須說謝謝你的支持。 – Shax 2011-06-03 13:12:20

0

你的模式要求小數點前的數字:

paytternToMatch = "(%w%w%w[%w%d][%w%d]%-.-%d*%p%d%d\n)\n[\n]*" 

此外,您可能要更明智的捕獲:

paytternToMatch = "(%w%w%w[%w%d][%w%d])%-.-(%d*%p%d%d)\n[\n]+" 
+0

paytternToMatch =「(%w%w%w [%w%d] [%w%d])%-.-(%d *%p%d%d)\ n [\ n] +」它只提取「ABC01」 – Shax 2011-06-06 09:06:09

+0

它返回多個值; for a,b asdsd:gmatch(..............) – daurnimator 2011-06-09 14:47:50