下面是我的模式,它对给定的字符串工作正常。
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 :(得分: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。
答案 1 :(得分: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]+"