2011-12-14 1 views
1

Heredoc과 유사한 구문에 대한 구문 강조 표시를 구현하려고합니다. 그러므로 나는 시작 이름을 붙잡아 야한다. 하지만 나는 (규칙과 범위에서 그것을 시도) 실패했습니다. 이것은 내 정규식입니다 :AvalonEdit : Regex XSHD 파일의 그룹 캡쳐

(?:([A-Z]{3,}))(.|\n)*?\1 

정규식은 정규식 테스트기에서 작동합니다.

Error at line 128: 
"(?:([A-Z]{3,}))(.|\n)*?\1" wird analysiert - Verweis auf die nicht definierte Gruppenzahl 1. 

는 groupnumber 1 밤은 정의 말한다 : 내가 XSHD-정의에 넣어 경우

는하지만 난이 오류가 발생합니다.

누군가 이유를 알고 있습니까? 그리고 어떻게 일치를 실현?

+0

*? back-reference itseft를 반복합니다. (? :([A-Z] {3,})) [. \ n] *? \ 1 –

답변

2

AvalonEdit은 RegexOptions.ExplicitCapture을 사용하므로 명명 된 캡처 그룹을 사용해야합니다.

그러나 AvalonEdit에서는 수행하려는 작업을 수행 할 수 없습니다. 규칙은 여러 줄로 작성할 수 없으며 스팬 끝은 스팬 시작에 역행을 사용할 수 없습니다.

강조 엔진이 각 행을 개별적으로 강조 표시하고 사용자가 텍스트를 편집 할 때 변경된 행만 다시 강조 표시하기 때문입니다. HEREDOC 구조를 지원하기 위해 AvalonEdit은 스팬 스택의 일부로 명명 된 캡처 그룹의 결과를 저장해야하며 스팬 엔드 정규식이 저장된 결과에 대한 역 참조를 사용할 수 있도록 일부 특수 구문을 지원해야합니다.

+0

하이라이팅 엔진의 통찰력에 감사드립니다. 다른 방법이 없다면, 해결 방법을 개발할 것입니다 (linetransformer 사용) – 0xDEADBEEF

0

*?

가 다시 참조 itseft을 반복 감사합니다.

방법에 대한

(?:([A-Z]{3,}))[.\n]*?\1

1
"(?:([A-Z]{3,}))(.|\n)*?\1" 

흠, 첫 번째 괄호 (?) 당신이 그룹화 할 때의 비 캡처 그룹이합니다 (말할 | 운영자)이지만, 돈 그것을 '기억'하기 위해 신경 쓰지 마라. 두 번째 괄호 안에는 그룹 1이되고 싶은 것은 그 안에 있습니다 : ([A-Z]{3,}). "이 안에있는 것을 기억하지 말라"는 말은 논리적 인 것처럼 보입니다.

어쨌든 두 배가 된 그룹의 포인트는 무엇입니까? (당신은 정량 시퀀스의 두 번째 부분을 지정하지 쉼표에도 필요) 당신은 말할 수 없습니다 :

"([A-Z]{3})[.\n]*?\1" //now \1 is defined? 

을 지금까지 당신이 그룹을 사용한 적이있는 세 번째 그룹, (.|\n)*? 등 + alternation + 수량 한정자를 한꺼번에 사용하면 원래 표현식에 액세스하려고하면 \ 3을 알 수 없습니다. [.\n]*?이 좋을 것입니다.