2014-11-18 3 views
3

Я пытаюсь разбить строку на подстроки с помощью Lua. Использование шаблона в цикл ниже я ожидал бы 4 матча, но я только получаю 2.Разбиение строки на подстроки в Lua

print(words[1]) дисплеи

«### Lorem Ipsum боль сидеть Амет, GRUSS consetetur sadipscing ELITR, СЕПГ диам nonumy eirmod TEMPOR invidunt ет Лабор и др Dolore маген aliquyam Erat, SED ди \ N "

и print(words[2]) дисплеев

" ### На Vero ЭОС et accusam et justo duo dolores et ea rebum. Stet не clita \ nkasd gubergren, никакого моря takimata Gruß Sanctus Эст \ п»

Может кто-то пожалуйста, объясните мне это поведение

i=0 
content = "###Lorem ipsum dolor sit amet, Gruß consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam \n ###voluptua. ###At vero eos et accusam et justo duo dolores et ea rebum. Stet clita \nkasd gubergren, no sea takimata Gruß sanctus est \n###XLorem ipsum dolor sit amet. Lorem ipsum \ndolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor \ninvidunt ut labore et Gruß dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.sdl" 
for word in string.gmatch(content, '###') 
do i = i+1 end 

if(i>1) then 
content = content .. '###' 
else end 

words= {}  
for y in string.gmatch(content,"(###.-)###") 
do 
    table.insert(words, y) 
end 

print(words[3]) 

ответ

0

Ваш первый цикл не найти четыре матча Попробуйте это подтвердить?.

for word in string.gmatch(content, '###([^#]+)') do 
    print(word) 
end 

Если это работает для вас, а затем сохранить word в цикле по мере необходимости.

2

Это упрощенная версия вашего второго цикла:

content = '###aa###bb###cc###dd###' 
words= {}  
for y in string.gmatch(content,"(###.-)###") do 
    print(y) 
    table.insert(words, y) 
end 

Выход:

###aa 
###cc 

Проблема заключается в том, с рисунком (###.-)###, второй ### потребляется, тоже. То, что вам нужно, похоже на регулярное выражение (###.+?)(?=###). К сожалению, шаблон Lua не поддерживает lookahead. Это одно из возможных способов:

local left = content 
local start = 1 
while true do 
    start, index, match = string.find(left, "(###.-)###") 
    if not start then break end 
    print(match) 
    left = left:sub(index - 3) --3 is the length of "###" 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^