2013-11-21 4 views
0

Привет Я пишу простой лексер, основанный на регулярных выражениях.символ регулярного выражения литерал против контекста

Один маркер лексер является CHARLITERAL что любой символ, заключенный в одинарные кавычки, то есть:

'A' 
'.' 

даже

''' 

допускается.

Единственный раз, когда это не допускается в такой ситуации, как этого

somerandomcontext'('"') 

В этом случае только CHARLITERAL в скобках является действительным, и он должен игнорировать первую одинарную кавычку. Я ищу регулярное выражение, которое возвращает '"' вместо '(', когда я передаю ему указанную выше строку. Очевидно, '[^\n\r]' не режет. К сожалению, я не так хорошо знаком с утверждениями в регулярных выражениях.

ответ

0

Один из способов сделать это - использовать утверждение с отрицательным взглядом. Следующее регулярное выражение должно вести себя так, как вы описываете.

'(?![()]).' 

Это выражение сначала ищет апостроф, а затем начинает негативный взгляд. Отрицательный взгляд говорит, что следующий символ не может быть открытой или закрытой круглой скобкой. Если это так, то полное выражение терпит неудачу. Если следующий символ является чем-то иным, чем скобкой, то он совпадает с любым следующим символом: (который теперь гарантированно не является родительским), за которым следует апостроф.

Учитывая следующую входную строку, это выражение вернет перечисленные совпадения. Он должен оставаться надежным, даже если между потенциальными литералами нет пробелов.

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

Смежные вопросы