56 / 56 / 44
Регистрация: 24.03.2016
Сообщений: 378
1

Регулярное выражение: поиск комментариев в коде

24.09.2016, 17:19. Показов 4674. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Стоит задача вывести в консоль все комментарии с кода ( "//" и "/* */") с помощью регулярного выражения.

Мой код:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import net.mindview.util.TextFile;
 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
 
public class Comment {
    public static void main(String[] args) {
 
        if (args.length < 1) {
            System.out.println("need args");
            System.exit(0);
        }
        Pattern p = Pattern.compile("^/{2}");
        Matcher m = p.matcher("");
        for(String line : new TextFile(args[0])) {
            m = p.matcher(line);
            while (m.find()) {
                System.out.println(line);
            }
        }
        System.out.println("----------------------------");
        String s = TextFile.read(args[0]);
        Matcher mInput =
                Pattern.compile("[/][*](.*)[*][/]$", Pattern.DOTALL|Pattern.MULTILINE)
                        .matcher(s);
 
       while (mInput.find())
            System.out.println(mInput.group());
 
 
        System.out.println("END");
    }
}


Проблема в том, что в консоль выводиться и текст между двумя комментариями.
Как это убрать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2016, 17:19
Ответы с готовыми решениями:

Регулярное выражение для многострочных комментариев
помогите сделать регулярку для много строчных комментариев...тобишь вида /*bla bla*/ я делаю вот...

Регулярное выражение: нахождение комментариев в тексте
Добрый день, Как найти в коде комментарий такого вида: /* Такой комментарий*/ /* Или такой.......

Регулярное выражение по удалению комментариев (не задеть хинты)
Необходимо написать регулярное выражение для удаления многострочных комментариев вида /* COMMENT...

Составить регулярное выражение для комментариев в тексте
Необходимо регулярное выражение для комментариев в тексте вида /*asd*/ также /**/(пустые) и /*...

6
56 / 56 / 44
Регистрация: 24.03.2016
Сообщений: 378
24.09.2016, 17:22  [ТС] 2
Вывод консоли:
Миниатюры
Регулярное выражение: поиск комментариев в коде  
0
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
24.09.2016, 18:37 3
Armatus, буквально пару дней назад делал эту задачу. Могу предложить два варианта:
1) Используешь флаг MULTILINE и пишешь регулярку для каждой возможной строки. К примеру, эта регулярка для комментариев /** и /*. Для // сам можешь написать.
Java
1
^ */\*{1,2}.*$|^ +\*.*$
2) Используешь флаг DOTALL. И можно использовать что-то такое:
Java
1
 */\*{1,2}.*?\*/
Опять же только для комментариев /** и /*.
Возможно, я написал какое-то извращение, т.к. недолго изучаю регулярные выражения

Добавлено через 35 минут
А конкретно по твоему коду. 25 строка - жесть, как мне кажется. Почитай экранирование, квантификаторы и тд.
1
56 / 56 / 44
Регистрация: 24.03.2016
Сообщений: 378
24.09.2016, 19:06  [ТС] 4
striker24, Ну я сделал старым, дедовским ( костыльным ) методом

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Comment {
    public static void main(String[] args) {
 
        if (args.length < 1) {
            System.out.println("need args");
            System.exit(0);
        }
 
        Pattern p = Pattern.compile("(^.+)?/{2}");
        Matcher m = p.matcher("");
        for (String line : new TextFile(args[0])) {
            m = p.matcher(line);
            while (m.find()) {
                System.out.println(line);
            }
        }
        System.out.println("----------------------------");
        
        String s = TextFile.read(args[0]);
        Pattern k = Pattern.compile("(^.+)?[/][*](.*)");
        Pattern k2 = Pattern.compile("(^.+)?[*][/](.*)");
        m.reset();
        boolean comment = false;
        for (String line : new TextFile(args[0])){
            m = k.matcher(line);
            if(comment)
                System.out.println(line);
            if(m.find()) {
                System.out.println(line);
                comment = true;
            }
            m = k2.matcher(line);
            if(m.find())
                comment = false;
        }
 
        System.out.println("END");
    }
}
0
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
24.09.2016, 19:31 5
Armatus, так, давай все-таки пойдем человеческим путём и не будем привыкать к костылям
1) Берешь любой исходник .java с комментариями. Считываешь его в какой нибудь StringBuilder. Как это делается написано в интернете на каждом углу.
2) Создаешь Matcher с шаблоном regex, соответствующим комментарию. Можешь использовать предложенные мной способы или что нибудь свое.
3) Ищешь в StringBuilder'е комментарии методом find(). Пока он истин, выводишь на консоль или пишешь в файл. Как угодно.
В итоге: кода меньше, код красивее и понятнее, один Pattern и Matcher. Большего не надо

Добавлено через 8 минут
Update. Поучиться регуляркам можешь прямо в IDE. Там можно открыть текстовый файл и осуществить поиск при помощи рег. выражения. Аналогичное можно сделать в каком-нибудь Notepad++ или тут.
0
56 / 56 / 44
Регистрация: 24.03.2016
Сообщений: 378
24.09.2016, 19:36  [ТС] 6
striker24, сайт крутой, спасибо!
0
1099 / 661 / 397
Регистрация: 07.11.2015
Сообщений: 1,062
27.09.2016, 13:29 7
А если встретится что-то вроде var = "*/*/*/*/*";
Нужно аккуратно пропустить содержимое в кавычках т.к. там могут быть экранированные символы.
Код
(?: [^/'"]+
  | " (?: [^"\\]+ | \\. )*+ "
  | ' (?: [^'\\]+ | \\. )*+ '
  | / (?! [/*] )
)*+
( //.*
| /\*(?s).*?\*/
)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
    Pattern r = Pattern.compile(
      "(?: [^/'\"]+                       \n"+
      "  | \"(?: [^\"\\\\]+| \\\\. )*+\"  \n"+
      "  | ' (?: [^'\\\\]+ | \\\\. )*+ '  \n"+
      "  | / (?! [/*] )                   \n"+
      ")*+                                \n"+
      "( //.*                             \n"+
      "| /\\*(?s).*?\\*/                  \n"+
      ")                                  \n",
      Pattern.COMMENTS);
    Matcher m = r.matcher(input);
    while (m.find())
      System.out.println(m.group(1));
1
27.09.2016, 13:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2016, 13:29
Помогаю со студенческими работами здесь

Составить регулярное выражение удаления комментариев в javasctipt вставках
В своей работе, использую в самодельном движке, вывод страницы в одну строчку. Вроде как чтоб было...

Изменить регулярное выражение в готовом коде
Есть такой код: var matches = Regex.Matches(resultHttpGet,@&quot;+&quot;).Cast&lt;Match&gt;().Select(match =&gt;...

Поиск комментариев в коде C#
Нужно в массиве строк( код C#) найти (большие) комментарии типа /* Бла бла бла бла бла бла бал...

Регулярное выражение, IP, поиск в строке
Порыскал по форуму, нашел пример, как реализовать, сделал такую функцию: public static boolean...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru