2011-06-03 78 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