2013-07-04 7 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.S. Я новичок в регулярных выражениях, поэтому, пожалуйста, не бить меня :)

ответ

2

Проблема в том, что ."matches any character (including newline).". И $ - это конец строки.

Вы можете попробовать использовать не-символ новой строки - [^\n] и изменение $ к (\n|$) (перевод строки или конец строки):

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

Но это соответствует # в любом месте, а не только в начале строки, так что давайте попробуем это:

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

^ это начало строки, поэтому в основном (^|\n) (начало строки или новой строки) как раз перед началом строки.

У вас возникла проблема? Что делать, если у вас есть 2 комментария в двух последовательных строках? Вы будете соответствовать только первой, так как новая строка будет потребляться во время сопоставления первой (так как следующий матч начинается с того, что предыдущий закончен).

обходным для этого используется упреждающая:

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

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

Может ли # предшествовать пробелы? Если это так, проверьте наличие нуля или более пробелов (\s*):

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

Спасибо! Последняя версия вашего регулярного выражения - это то, что мне нужно. Кстати, можете ли вы предложить несколько хороших примеров/книг о 'QRegExp'? Мне нужно глубоко раскрыть их из-за интенсивного использования. – eraxillan

+1

У меня нет никаких обязательных рекомендаций. Regex следует стандартным синтаксисом (с некоторыми незначительными вариациями), поэтому любой учебник должен быть в порядке. [Это (для QT)] (http://harmattan-dev.nokia.com/docs/library/html/qt4/qregexp.html#details) содержит введение и рекомендует «Освоение регулярных выражений (третье издание) Джеффри EF Friedl ". [Здесь также есть сайт, на который я иногда ссылаюсь) (http://www.regular-expressions.info/). Или вы можете просто проверить несколько [этих] (https://www.google.com/search?q=introduction+to+regular+expressions). – Dukeling

+0

Еще раз спасибо, я увижу эти материалы. P.S. Я надеюсь, что я никогда не буду вынужден анализировать HTML с помощью регулярных выражений :) – eraxillan