2014-09-13 3 views
1

텍스트를 구문 분석하려고하고 태그를 기반으로 작업을 수행하려고합니다.루아의 태그와 일치하는 패턴

텍스트는 다음과 같습니다

<window> 
    <caption>My window 
</window> 
<panel> 
    <label> 
     <caption> 
     <position>50,50 
     <color>255,255,255 
    </label> 
</panel> 

코드 :

값을 받고 실패 할 것
function parse_tag(chunck) 
    for start_tag,tag_name in string.gfind(chunck,"(<(.-)>)") do 
     if (child_obj[tag_name]) then 
      print(start_tag) 
      for data,end_tag in string.gfind(chunck,"<" .. tag_name ..">(.-)(</" .. tag_name ..">)") do 
       for object_prop,value in string.gfind(data,"<(.-)>(.-)") do 
        print("setting property = \"" .. object_prop .. "\", value of" .. value); 
       end 
      end 
      print("</" .. tag_name ..">"); 
     elseif(findInArray(main_obj,tag_name)) then 
      print("Invalid data"); 
      stop(); 
     end 
    end 
end 
for key,tag in ipairs(main_obj) do 
    for start_tag,tag_name,chunck,end_tag in string.gfind(data,"(<(" .. tag.name .. ")>)(.-)(</" .. tag.name .. ">)") do --> searching for window/panel start and end tags 
     if (findInArray(main_obj,tag_name)) then 
      print(start_tag) 
      parse_tag(chunck); --> parses the tag with child tag 
      print(end_tag) 
     end 
    end 
end 

나는 다음과 같은 출력을 얻을 같이

<window> 
</window> 
<panel> 
<label> 
setting property = "caption", value of 
setting property = "position", value of 
setting property = "color", value of 
</label> 
</panel> 

은 어떻게 사용할 수 있습니다 첫 번째 <%tag%> 다음의 문자열을 다음 <%tag%> 또는 청크의 끝까지 일치시킵니다.

+0

을 작동하는 것 같다? – legends2k

답변

1
string.gfind(data,"<(.-)>(.-)") 

여기에서 .-으로 값을 일치 시키려고합니다. 그러나 -은 게으르다. 즉, .-은 가능한 한 적은 수의 입력 (이 경우 빈 문자열)을 시도합니다. 그것을 말하는

봅니다 다음 <까지 일치합니다 :

string.gfind(data,"<(.-)>(._)<") 
+0

나는 <(.-)>과 그 다음의 <(.-)> 또는 파일 끝 사이의 문자열을 캡처하려고합니다. greedy modifier를 사용하면 다음을 무시합니다. – user3185939

+0

@ user3185939 'string.gfind'에 대해 모르겠으며 예제가 최소가 아닙니다. , 가장 안쪽 루프에서 '데이터'는 ' 50,50'과 같은 것을 포함한다고 생각했습니다. 어쨌든 다음'''이 여전히''데이터 '에 있다면''<(.-)> (._) < "'을 시도해보십시오. –

+0

@ user3185939 그래도 문제가 해결되지 않으면 [최소, 완전하고 검증 가능한 예제] (http://stackoverflow.com/help/mcve)를 작성하십시오. 2 ~ 3 줄의 코드로 문제를 표시 할 수 있습니다. –

0

은 캡처의 다른 유형을 시도했다. 아닌 XML 파서를 사용하는 이유 이

, 이것은 일반적으로 좋은 생각이 될 것으로 보인다