Regex игнорировать комментарии в Java - PullRequest
1 голос
/ 11 мая 2011

Кажется, я не могу найти краткий ответ на этот вопрос, и, поскольку я очень мало знаю о регулярных выражениях, я чувствую, что самый простой вариант - это спросить.

Я пытаюсь считать строки кода в затмении,что я могу сделать, но он включает в себя комментарии.

По сути, мой шаблон регулярных выражений "\ n"

Довольно простой, да, но, как я ни стараюсь, я не могунайти способ игнорировать строку, начинающуюся с "//"

Я пробовал [^ (//)], но это, кажется, считает каждый "/".Я пробовал то же самое без разделителя: "\"

Любые идеи, даже если вы просто укажете мне правильное направление, мои поиски в Google не дали ничего полезного.

Ответы [ 5 ]

4 голосов
/ 11 мая 2011

Лучше использовать негативный взгляд здесь.Для вашего кода дела, подобного этому, будет работать:

String str = "Line1\n" +
"/Line2\n" +
"//Line3\n" +
"Line4\n" +
" // Line5\n" +
"Line6\n";
Pattern pt = Pattern.compile("^(?!\\s*//)", Pattern.MULTILINE);
matcher matcher = pt.matcher(str);
int c=0;
while (matcher.find()) c++;
System.out.println("# of lines: " + c);

Вывод

# of lines: 4

(?!\\s*//) является отрицательным прогнозом, который говорит о совпадении, только если строка не начать с 0 or more spaces followed by //
Как вы можете видеть, есть две строки выше, начиная с комментария //, следовательно, они не учитываются.
Также важно использовать флаг Pattern.MULTILINE, чтобы каждая строка распознавала началостроки ^.

1 голос
/ 11 мая 2011

Существуют более эффективные способы и другие инструменты для подсчета строк кода, например, инструмент покрытия тестов или (я не знаю, работает ли это с самой новой версией): http://metrics.sourceforge.net/

Если выпросто игнорируйте //, тогда вы все равно будете считать объявления package и import вместе с многострочными комментариями, такими как:

/**
 * Javadoc
 */

или скобками, которые располагаются в одиночных строках, например:

while(...)
{
    ...
}
1 голос
/ 11 мая 2011

Упрощенное регулярное выражение, улучшится, если вам нужно больше:

^//

Все в [] является классом символов, что означает совпадение с одним из символов в нем. Кроме того, добавление ^ является обратным к этому и не совпадает с ^, за пределами которого используется начало строки.

Вы также можете сделать что-то вроде:

^[^/][^/].*

для сопоставления строк, не начинающихся с //

0 голосов
/ 18 июля 2011

^ \ s * (?! //) \ S. * $

Подсвечивает любую строку, которая начинается ("^") с любого количества пробелов (\ s * "), затем не начинаетсякомментарий ("(?! //)"), затем имеет непустой символ ("\ S"), затем любое количество символов до конца строки (". * $").

0 голосов
/ 11 мая 2011

Я не знаком с затмением, но если оно имеет перспективу, это следует сделать:

\n(?!//)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...