2012-03-05 2 views
1

일부 VHDL 코드를 구문 분석하려고합니다.VHDL 문자열 리터럴 정규식

문자열 리터럴을 찾는 정규 표현식을 찾고 있습니다. 문자열 리터럴이 너무 큰 따옴표로 묶여 :

" {characters} " 

문제는 현재 다음과 같은 요구 사항입니다 : 인용 마크 값은 다음 문자 값의 순서로 표현하는 경우

한 쌍의 인접한 따옴표는 문자열 리터럴 내의 해당 위치에 작성되어야합니다.

이 의미는 다음과 법적 문자열 리터럴은 다음과 같은 경우

"""" 
" random stuff "" random stuff " 

잘 모르겠어요 :

("(("")*[^\n"]*)*") 

충분히 내가 /"([^"]|"")+"/가 대부분 일 것입니다 희망

+0

어떻게 이스케이프 된 따옴표를 다루는 지, 합법적 인 문자열 리터럴 인 "" ""이 없으므로 이것을 가질 수 있습니다 : "" "" "" "" "? 그것은 문자열 리터럴이거나, 단지 공간에 떠있는 이중 따옴표 일뿐입니다. 모든면에서 그것을 가질 수는 없습니다. – sweaver2112

+1

확실하지 않다면 정규 표현식을 사용해보십시오 :'find -name '* .vhdl'| 고양이 xargs | perl -ne 'print if/regex /'> yourResult.txt' 그러면''':'find -name '* .vhdl'| xargs cat | perl -ne '을 포함하는 행을 검색하는 것과 어떻게 결과가 다른지보십시오 print if/"/ '> allQuotes.txt'. 'wc -l yourResult.txt allQuotes.txt' – nodakai

+0

호기심, sebs,이 이스케이프되지 않은 큰 따옴표도 일치시키고 싶지 않으십니까? 'dkfasdfasdfasd "kjlkdsajf? 왜 안되니? – sweaver2112

답변

3

을 포함하여 필요한 것. 그것을 시도하십시오.

편집 : +*이어야합니다. 영업 자체가 나보다 더 나은 정규식을 알고있어!

0

이 시도해 볼 수도 있습니다 : (의사 /정규식/)

/(?<!["\\])"(\w\s)+"(?!")/ 

후 사용 정규식 역 참조가 :

replace = "\"" + match.$1 + "\"" 

참고 :이 표현은 에 순진한 시도가 이미 탈출 일치하지 않을 수 있습니다 큰 따옴표 (뒤를 돌아보고 \ 또는 "이 표시되지 않지만 \\"은 실제로는 큰 따옴표입니다. 전자 앞에 일반 백 슬래시, the more you think about it the more complicated it gets이 있습니다.

6

정규 표현식 대신 전체 렉자이 필요할 수 있습니다. 내가 여기에 읽은 제안은, 예를 들어, 잘못된 반응을 일으킬 수 있습니다

a <= '"'; -- assigns the character " to signal a. 

귀하의 정규식 여기 "'; -- assigns the character " 일치합니다.

그런데 코드에 주석이나 문자 리터럴 또는 문자열에 이상한 큰 따옴표가 포함되어 있지 않으면 가장 간단한 정규식이 사용됩니다.

+0

나는 여러 그룹으로 정규 표현식을 만들 수 있다고 생각합니다. ''그렇듯이. 대부분의 정규 표현 엔진은 정규 표현식을 왼쪽에서 오른쪽으로 평가합니다. 두 번째 그룹에 무언가가있는 경우 유효한 문자열 리터럴로 인식됩니다 – sebs

+0

@ sebs 당신의 제안 된 정규 표현식은 아직 코멘트 (또는 블록 주석) 또는 확장 식별자의 인용문을 고려하지 않고 단지 매우 복잡해집니다. 정규 표현식이 작업에 적합한 도구가 아닐 수도 있다는 지적하고 싶습니다. – Philippe