2013-08-01 1 views
0

LUA를 사용하여 테이블 내에 테이블을 만들고 문제가 발생합니다. 표시되는 NIL 값도 채워야하지만 제대로 표시되지는 않습니다.빈 하위 문자열이있는 구분 기호를 기반으로 문자열을 하위 문자열로 분리

문자열을 조작되고 :

PatID = '07-26-27~L73F11341687Per^^^SCI^SP~N7N558300000Acc^' 

for word in PatID:gmatch("[^\~w]+") do table.insert(PatIDTable,word) end 
local _, PatIDCount = string.gsub(PatID,"~","") 

PatIDTableB = {} 
for i=1, PatIDCount+1 do 
    PatIDTableB[i] = {} 
end 

for j=1, #PatIDTable do 
for word in PatIDTable[j]:gmatch("[^\^]+") do 
    table.insert(PatIDTableB[j], word)   
end 
end 

이 현재이 출력이 생성

table 
[1]=table 
[1]='07-26-27' 
[2]=table 
[1]='L73F11341687Per' 
[2]='SCI' 
[3]='SP' 
[3]=table 
[1]='N7N558300000Acc' 

을하지만 그것을 생산해야합니다

table 
[1]=table 
[1]='07-26-27' 
[2]=table 
[1]='L73F11341687Per' 
[2]='' 
[3]='' 
[4]='SCI' 
[5]='SP' 
[3]=table 
[1]='N7N558300000Acc' 
[2]='' 

편집 : 나는 내가 가지고있는 것 같아요 내가 무엇을 찾고 있는지 설명하는 나쁜 일을했다. 반드시 캐럿을 "NIL"또는 "비어있는"것으로 간주 할 필요는 없지만 오히려 새로운 캐릭터 라인을 시작한다는 의미입니다.

더 나은 설명이 부족하여 위치 식별자가 부족합니다. 내가

L73F11341687Per^12ABC^^SCI^SP 

을 가지고 있다면 그런 위치가

1. L73F11341687Per 
2. 
3. 
4. SCI 
5. SP 

:

따라서, 예를 들어 :에

L73F11341687Per^^^SCI^SP 

실제로 변환

1. L73F11341687Per 
2. 12ABC 
3. 
4. SCI 
5. SP 

그리고 다시 테이블은 다음과 같습니다

table 
[1]=table 
[1]='07-26-27' 
[2]=table 
[1]='L73F11341687Per' 
[2]='12ABC' 
[3]='' 
[4]='SCI' 
[5]='SP' 
[3]=table 
[1]='N7N558300000Acc' 
[2]='' 

는 희망이 내가 할 노력하고있어에 조금 더 빛이 나고.

+0

원하는 답변에서 'SCI'와 'SP'사이에 공백이 없어야합니까? –

답변

1

질문에 대한 답변을 정리 했으니 여기에 문제가 있습니다.

gmatch 패턴은 지정된 문자열에서 일치하는 부분 문자열을 모두 반환합니다. 그러나 gmatch 패턴은 "+"를 사용합니다. 즉, "하나 이상"을 의미하므로 이 빈 문자열과 일치 할 수 없습니다. 문자가 ^ 인 경우 건너 뜁니다.

그러나 공백 검색을 허용하는 :gmatch("[^\^]*")을 방금 시도한 경우 모든 ^ 문자를 빈 일치 항목으로 효과적으로 바꿔야하는 것이 문제입니다. 네가 원하는게 아니야.

원하는 것은 부분 문자열 끝에 ^을 먹는 것입니다. 그러나 :gmatch("([^\^])\^")을 시도하면 마지막 문자열이 반환되지 않습니다. 마지막 문자열은 ^으로 끝나지 않으므로 유효하지 않습니다.

gmatch과 가장 근접한 패턴은 "([^\^]*)\^?"입니다. 이것은 끝에 빈 문자열을 넣는 단점이 있습니다. 그러나, 그 중 하나는 항상 거기에 놓이기 때문에 쉽게 제거 할 수 있습니다.

+0

나는 왜 이것이 일어나고 있는지 이해하지만, 나는 필요한 수정을하는 방법에 대해 약간 혼란 스럽다. 나는 어떻게 karats 대신에 빈 문자열을 사용할 수 있을지 모르지만 여전히 테이블에 필요한 값을 채워야한다. – intruis

+0

@AllistaireMair : 죄송합니다. 질문을 잘못 해석했습니다. 내 대답을 업데이트했습니다. –

+0

더 많은 정보로 내 질문을 업데이트 할 것입니다. – intruis

0
local s0 = '07-26-27~L73F11341687Per^^^SCI^SP~N7N558300000Acc^' 

local tt = {} 
for s1 in (s0..'~'):gmatch'(.-)~' do 
    local t = {} 
    for s2 in (s1..'^'):gmatch'(.-)^' do 
     table.insert(t, s2) 
    end 
    table.insert(tt, t) 
end