2016-09-01 5 views
3

key="VALUE"을 포함하는 행의 VALUE를 추출하려고합니다.이를 해결하기 위해 간단한 루아 패턴을 사용하려고합니다.루아 패턴의 캡쳐 그룹은 캡쳐 그룹 대신 리터럴 숫자 문자와 일치합니다.

VALUE에 리터럴 1이 포함 된 행을 제외한 행에서 작동합니다. 패턴 파서가 내 캡처 그룹을 이스케이프 시퀀스로 혼동시키는 것 같습니다.

> return string.find('... key = "PHONE2" ...', 'key%s*=%s*(["\'])([^%1]-)%1') 
5  18  "  PHONE2 
> return string.find('... key = "PHONE1" ...', 'key%s*=%s*(["\'])([^%1]-)%1') 
nil 
> 

답변

1

[^%1]을 전혀 사용할 필요가 없습니다. 그냥 .-을 사용하십시오. 정의상 가장 작은 문자열과 일치합니다.

또한, 당신은 당신의 패턴에 따옴표를 탈출해야하지, 여러 줄 문자열 구문을 사용할 수 있습니다 :

> s=[[... key = "PHONE1" ...]] 
> return s:find [[key%s*=%s*(["'])(.-)%1]] 
5  18  "  PHONE1 

[^%1] 실제로 의미 패턴을 개별적으로 문자 %1를 검색하지 않습니다.

+0

감사합니다. 나는 세트에서 캡쳐 그룹을 포함하도록 강제하기 위해 1을 벗어날 것이라고도 알았다. '[^ % \ 1] ' 당신의 솔루션은 더 이해하기 쉽고 더 깨끗합니다. 나는 그것을 사용할 것이다. – nolan

+0

@nolan이 경우, 단지 [[^ \ 1]'을 사용하고 싶을뿐입니다. '%'문자는 필요하지 않습니다. – hjpotter92

+0

실제로 그렇지 않습니다. 고맙습니다. – nolan