2014-09-25 4 views
4

간단한 패턴 매칭을 사용하여 루아에서 화학 공식을 파싱하려고합니다. 그러나 캡처 그룹을 선택적으로 지정하는 방법을 알지 못합니다.루아 패턴 매칭을 사용하는 선택적 그룹 캡쳐

pattern = "(%u%l*)(%d*)" 

첫번째 그룹 (즉 "H", "그", 등등) 원자 기호 포착 번째 그룹에있는 그 원자의 수를 캡처 : 여기 마련 한 패턴 분자. 일반적으로이 값은 정수 값이지만 1 인 경우, 그것은 종종 같이 생략 :

formula = "C2H6O" 

count의 결과가 ''입니다 일치가없는 경우 나, 글로벌 경기을 시도 내가 예상 할 것 인 대신에 nil. 내가 궁금해서 count = ''하지만 만약 루아의 선택적 캡처 그룹이 있다면

compound = {} 
for atom,count in string.gmatch(formula, pattern) do 
    compound[atom] = count or 1 
end 

은 분명히 난 그냥 확인할 수 있습니다.

답변

3

루아에 선택적 캡처 그룹이있는 경우.

아니오; pattern items은 캡처를 허용 가능한 옵션으로 나열하지 않으므로 Perl에서와 같이 캡처 할 수 없습니다 (예 : (%d*)?).

+2

감사합니다, 제로 브랜 BTW에 큰 일은, 내가 현재 사용하고있는 것입니다 :) – Moop

+0

피드백에 대한 Moop 감사합니다! –

2

루아에는 선택적 캡처 그룹이 없습니다.

count은 빈 문자열이 %d*과 일치하기 때문에 nil 대신 빈 문자열입니다.

대신을 시도 tonumber이 카운트가 검사 할 것입니다있는 빈 문자열 인 경우 nil을 돌려 보낼

compound[atom] = tonumber(count) or 1 

참고.

+0

빈 문자열과 일치 할 때 의미하는 바를 얻지 못합니다. 그것에 대해 더 설명해 주시겠습니까? 모든 것이 일치하지 않습니까? – Moop

+0

@Moop,'% d *'은 * 0 이상의 숫자 *를 의미합니다. – lhf

+0

@ihf 물론, 모든 "빈 문자열"과 일치한다는 의미는 아니겠습니까? – Moop