2011-06-03 1 views
0

ниже мой шаблон, который отлично работает с данной строкой.Lua pattern не работает должным образом, когда 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 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 

Но когда я удаляю 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

ответ

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

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

+0

, он возвращает несколько значений; для a, b в asdsd: gmatch (..............) – daurnimator