2013-06-13 2 views
4

내가 같은 문자열을 구문 분석하려고 : &1 first &2 second &4 fourth \\ 그것에서 테이블루아 패턴 매칭 : 구분 된 캡처

t = {1=first, 2=second, 4=fourth} 

를 구축하는 나는 매우 나의 순진한 시도 일반적으로 정규식 경험이 아니에요 (순간위한 \\ 테이블 부분)을 무시하면 I가 두 쌍 캡처 참조 기대 된 첫 번째 쌍의 포착을 제공

local s = [[&1 first &2 second &4 fourth \\]] 

for k,v in string.gmatch(s, "&(%d+)(.-)&") do 
    print("k = "..k..", v = "..v) 
end 

이었다. 나는 약간의 독서를했고, lpeg 라이브러리를 발견했다. 그러나 그것은 나에게 대단히 친숙하지 않다. lpeg이 필요합니까? 아무도 내 오류를 설명 할 수 있을까?

+3

''% s ': (% d +) ([^ &] *)'' –

+0

@EgorSkriptunoff Aha, 감사합니다. 여기'([^ &] *)'는'&'를 포함하지 않는 가장 긴 문자 시퀀스와 일치합니까? –

+1

@EgorSkriptunoff, 대답을 넣을 수있는 "덧글 추가"아래에 큰 텍스트 상자가 있습니다.) –

답변

2
  1. &(%d+)(.-)&하면 값이 한 단어임을 알고있는 경우 2 second &4 fourth \\을 떠나 &1 first &
  2. 귀하의 패턴이 일치하지 않는 항목이 더
+0

전체 패턴은 일단 발견되면 사용됩니다. 이제 의미가 있습니다. 고마워요. –

1

에 일치하는 일치,이 작업을해야합니다 :

string.gmatch(s, "&(%d+)%s+([^%s&]+)") 

"&" 1 개 이상의 숫자 (캡처 된), 하나 이상의 공백, 하나 이상의 비 공백, & 자 (캡처 된) 순으로 표시됩니다.

+0

폴 감사합니다. 캡처 할 자료는 불행히도 비교적 자의적입니다. –

+0

그런 다음 @ Egor의 솔루션을 따라갈 수 있으며 후행 공백을 제거 할 수 있습니다 (필요한 경우). –