2013-07-04 3 views
1

qmake 프로젝트 파일에서 한 줄 주석을 추출해야합니다. 규칙은 간단합니다. 주석은 # 기호로 시작하고 줄 바꿈 \n으로 시작하십시오. 그래서 내가 QRegExp에 대한 몇 가지 문서를 읽고, qmake를 파일에있는 모든 주석을 인쇄하는 등의 코드를 작성 해요 :코드에서 한 줄 주석을 추출하는 QRegExp

QRegExp re ("#(.*)\n$"); 
re.setMinimal (true); 
int comment_index = 0; 
while ((comment_index = _project_contents.indexOf (comment_expr, comment_index)) != -1) 
{ 
    QString comment_text = comment_expr.cap (0); 
    qDebug() << "Comment 1" << comment_text; 
} 

를하지만 제대로 작동하지 않습니다 - 프로젝트 파일의 바로 모든 내용이 인쇄되었습니다. 내 실수는 어디에 있습니까? 워드 프로세서에서 알 수 있듯이이 작업은 효과가 있지만 그렇지 않습니다.

P. 나는 정규 표현식의 초보자이다. 그래서 나를 때리지 말아라.

답변

2

문제는 ."matches any character (including newline)."이다. $은 문자열의 끝입니다.

당신은하지-줄 바꿈 사용하여 시도 할 수

- $(\n|$) (개행 문자 또는 문자열의 끝) [^\n] 및 변경 :

"#[^\n]*(\n|$)" 

을하지만 이것은 단지 행의 시작 어디서나 대신 # 일치, 그래서이를 해보자 :

"(^|\n)#[^\n]*(\n|$)" 

^ 그래서 기본적으로 (^|\n) (문자열 또는 새로운 라인의 시작), 문자열의 시작입니다 단지 행의 시작 전에이다.

거기에 문제가 생길 수 있습니까? 2 연속 코멘트에 2 개의 코멘트가 있다면? 첫번째 줄과 일치 할 때 줄 바꿈이 사용되기 때문에 첫 줄만 찾습니다 (이전 줄이 끝난 곳에서 다음 줄이 시작되기 때문에).

이에 대한 주위에 작업 사용 예견이 최종 줄 바꿈이 발생

"(^|\n)#[^\n]*(?=\n|$)" 

이 (하지만 여전히 체크) 경기를 포함하지 않는, 따라서 위치는 직전 될 것입니다 새로운 라인과 다음 경기가 그것을 사용할 수 있습니다.

# 앞에 공백을 사용할 수 있습니까? 그렇다면 0 개 이상의 공백 (\s*)을 확인하십시오.

"(^|\n)\s*#[^\n]*(?=\n|$)" 
+0

고마워요! 정규식의 마지막 버전은 내가 필요로하는 것입니다. 그건 그렇고,'QRegExp'에 대한 훌륭한 예제/책을 제안 할 수 있습니까? 나는 무거운 사용 때문에 깊이 undestand 필요합니다. – eraxillan

+1

필자는 꼭 사용해야 할 권장 사항이 없습니다. 정규 표현식은 약간의 변형이있는 표준 구문을 따르므로 어떤 자습서도 좋을 것입니다. [이 (QT 관련)] (http://harmattan-dev.nokia.com/docs/library/html/qt4/qregexp.html#details)에는 소개가 있으며 Jeffrey의 "Mastering Regular Expressions (제 3 판)"을 권장합니다. EF Friedl ". [여기에 내가 가끔 링크하는 웹 사이트도 있습니다] (http://www.regular-expressions.info/). 또는 몇 가지 [https://www.google.com/search?q=introduction+to+regular+expressions]를 체크 아웃 할 수 있습니다. – Dukeling

+0

다시 한번 감사 드리며,이 자료를 보게됩니다. 오후 8시 30 분 P.S. 나는 정규식을 사용하여 HTML을 구문 분석하지 않을 것입니다. – eraxillan

관련 문제