2013-11-21 2 views
0

안녕하세요 저는 정규 표현식을 기반으로 간단한 렉서를 작성하고 있습니다.정규 표현식 문자 리터럴 대 컨텍스트

한 렉서 토큰은 작은 따옴표로 묶여있는 문자가되는 CHARLITERAL입니다 즉 :

'A' 
'.' 

''' 

이 허용됩니다.

이 허용되지 않는 유일한 시간은 괄호 안에이 경우에만 CHARLITERAL에서이

somerandomcontext'('"') 

같은 상황에 유효하고, 그 첫 번째 작은 따옴표를 무시해야합니다. 위의 문자열을 먹이면 '(' 대신 '"'을 반환하는 정규식을 찾고 있습니다. 분명히 '[^\n\r]'은 절단하지 않습니다. 불행히도 정규 표현식의 주장에 익숙하지 않습니다.

답변

0

이렇게 할 수있는 방법 중 하나는 부정적인 표제 어설 션을 사용하는 것입니다. 다음 정규 표현식은 사용자가 설명하는 방식으로 작동해야합니다.

'(?![()]).' 

이 표현식은 처음에는 아포스트로피를 찾은 다음 음수 미리보기를 시작합니다. negative-lookahead는 다음 문자가 열림 또는 닫힌 괄호가 될 수 없다고 말합니다. 그럴 경우 전체식이 실패합니다. 다음 문자가 괄호 이외의 문자 인 경우 실제로 다음 문자가 무엇이든간에 (이제는 모호해가 아니어야 함)과 일치하며 아포스트로피가옵니다.

다음 입력 문자열이 주어지면이 표현식은 나열된 일치 항목을 반환합니다. 잠재적 인 리터럴 사이에 공백이 없더라도 견고하게 유지되어야합니다.

Input:  
'A' '.' '''somerandomcontext'('"')'B''C''''''' sadfasdf'(')'L') 

Matches: 
1: 'A' 
2: '.' 
3: ''' 
4: '"' 
5: 'B' 
6: 'C' 
7: ''' 
8: ''' 
9: 'L' 

http://www.regular-expressions.info/lookaround.html

+0

감사합니다. 나는 결국 '(?! \\ ('[^ \ n \ r] '\\)) [^ \ n \ r]'을 사용했다. 왜냐하면 열린 괄호 만 있지만 닫는 괄호는없는 상황을 포착하기 때문입니다. – sebs