Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 57
1

Удаление комментариев

04.11.2016, 20:49. Просмотров 4932. Ответов 22
Метки нет (Все метки)


необходимо написать программу для удаления комментариев в коде из исходного файла с разрешением .txt с последующим сохранением нового текста кода в новом файле с разрешением .txt

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication3
{  /// class Program here
  class Program
{
    static void Main(string[] args)
    {
      /// TODO code application logic here
      string ss="sdfsdf"\\*sdfsdf*\\"";
      int i /*jjjjj*/ = 0;
char cccc = '"'; //"hjhkjhkj
      Console.WriteLine("/*dfsdf*////****/**//**Hello, world!\");/**/ //
вопрос в том как сделать так чтобы не удаляло не комментарии которые записаны как комментарии, знаю что звучит как масло масляное, но все же
допустим в строке
C#
1
 Console.WriteLine("/*dfsdf*////****/**//**Hello, world!\");/**/ //
комментарии лишь в конце. В скобках записан текст как комментарий который не подлежит удалению
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2016, 20:49
Ответы с готовыми решениями:

Удаление комментариев
Имеется задача по удалению комментариев из файла и есть решение но оно не отрабатывает...

Удаление комментариев из кода типа /* */
Дали такое задание: используя концепцию конечного автомата удалить из кода комментарии типа: "/*...

Удаление из текста комментариев и тегов summary
Исходный текст представляет описание класса на C#. Напишите процедуру, удаляющую из этого текста...

Удаление комментариев HTML (Regex)
HTML = Regex.Replace(HTML, "<!--(.+?)-->", string.Empty, RegexOptions.IgnoreCase); такой код...

22
$ su
1603 / 518 / 97
Регистрация: 18.11.2010
Сообщений: 2,807
Записей в блоге: 2
04.11.2016, 22:36 2
Регулярками, как вариант построчно считать файл и каждую строку проверить регулярками.
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 57
04.11.2016, 23:32  [ТС] 3
ntlinuxnt, построчно да, но как описать что комменты в Console.WriteLine удалять не надо
0
4651 / 3203 / 1365
Регистрация: 09.05.2015
Сообщений: 7,874
04.11.2016, 23:47 4
Думаю с помощью Roslyn можно распарсить код.

https://social.msdn.microsoft.... rum=roslyn
1
3 / 3 / 2
Регистрация: 02.11.2016
Сообщений: 22
04.11.2016, 23:59 5
ntlinuxnt, построчно чисто регулярками не получится так как в наличии есть многострочные комментарии. Регулярное выражение по их обнаружению обязано обрабатывать весь файл целиком, а не только строка за строкой.

C#
1
2
3
4
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
ner94,
Цитата Сообщение от ner94 Посмотреть сообщение
как описать что комменты в Console.WriteLine удалять не надо
Зависит от формата коментов. Если они только такие как в примере:

C#
1
Console.WriteLine("/*dfsdf*////****/**//**Hello, world!");/**/ //
то вычленить их можно вот так, например:

C#
1
2
3
4
5
6
7
8
String str = "...тут ваш текст...";
regex = new Regex("WriteLine\([^)]*\)");
 
        foreach (string str in test)
        {
            if (regex.IsMatch(str))
                Console.WriteLine("В исходной строке: "{0}" есть совпадения!", str);
        }
Но вообще конечно надо не пытаться одно регулярное выражение написать, на все возможные варианты, а в несколько итераций текст обработать. Первый раз прошли - удалили все многострочные и однострочные комменты вида /*......*/. Второй раз: все //....... Третий раз: ещё какие-нибудь. И так далее. Видов коментариев конечное число вариантов. Столько же будет и итераций.
0
900 / 656 / 318
Регистрация: 23.10.2016
Сообщений: 1,537
05.11.2016, 04:20 6
Стало интересно, взял и написал эту программу.
Выдало:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication3
{  
  class Program
{
    static void Main(string[] args)
    {
      
      string ss="sdfsdf"\\*sdfsdf*"";
      int i  = 0;
char cccc = '"'; 
      Console.WriteLine("/*dfsdf*////****/**//**Hello, world!");/**/ //

Код тут: https://github.com/UnresolvedE... ree/master

Добавлено через 55 секунд
В 17 строчке перед второй кавычкой на самом деле есть слэш, но этот форум её схавал
0
3 / 3 / 2
Регистрация: 02.11.2016
Сообщений: 22
05.11.2016, 05:19 7
Выдало:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication3
{  
  class Program
{
    static void Main(string[] args)
    {
      
      string ss="sdfsdf"\\*sdfsdf*"";
      int i /*jjjjj*/ = 0;
char cccc = '"'; //"hjhkjhkj
      Console.WriteLine("/*dfsdf*////****/**//**Hello, world!");/**/ //


В 17-й, по входу, (14-я на выходе) действительно бэкслэш пожран - он там есть! ) Но часть комментов (это 15...17 строки по выходу) не удалились. Наверное в репозитории не последняя версия запушена.

Впрочем это не важно. Принцип понятен.

UPDATE:

В 14-й ещё один бэкслеэш оказывает сожрался. Потому и дальше пошли косяки. Теперь вот так:

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication3
{  
  class Program
{
    static void Main(string[] args)
    {
      
      string ss="sdfsdf"\\*sdfsdf*\\"";
      int i  = 0;
char cccc = '"'; 
      Console.WriteLine("/*dfsdf*////****/**//**Hello, world!");/**/ //
0
900 / 656 / 318
Регистрация: 23.10.2016
Сообщений: 1,537
05.11.2016, 14:42 8
Ffel, В репозитории последняя версия, и я не знаю почему у Вас она по-другому работает...
0
3 / 3 / 2
Регистрация: 02.11.2016
Сообщений: 22
05.11.2016, 14:55 9
Да так же работает - я же апдейт мессиджа сделал.
0
900 / 656 / 318
Регистрация: 23.10.2016
Сообщений: 1,537
05.11.2016, 14:59 10
Ffel, я Вас неправильно понял, я подумал, что вы прогу подкорректировали и только после этого заработало
1
Эксперт .NET
8643 / 6104 / 1017
Регистрация: 21.01.2016
Сообщений: 23,031
06.11.2016, 06:00 11
Народ, какие регулярные выражения? Единственный корректный способ решить эту задачу - составить конечный автомат, который будет различать комментарии к коде и в строке текста (что не нужно удалять).
0
4651 / 3203 / 1365
Регистрация: 09.05.2015
Сообщений: 7,874
06.11.2016, 07:56 12
Незнаю чем им вариант с Roslyn не понравился по ссылке выше... Гораздо проще чем эти велосипеды изобретать.

Добавлено через 1 час 39 минут
Переписано под актуальную версию Roslyn:

C#
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
 
namespace RoslynRemoveAllComments
{
    class Program
    {
        static void Main(string[] args)
        {
            string code = @"class Program
{
// SingleLineComment
    public static void Main()
    {
/*
    MultiLineComment
    MultiLineComment
    MultiLineComment
*/
    }
}";
 
            var tree = CSharpSyntaxTree.ParseText(code);
            var oldRoot = tree.GetRoot();
            Console.WriteLine(oldRoot.ToFullString());
 
            CSharpSyntaxRewriter rewriter = new Rewriter1();
            var newRoot = rewriter.Visit(oldRoot);
            Console.WriteLine(newRoot.ToFullString());
 
            Console.ReadKey();
        }
    }
 
    class Rewriter1 : CSharpSyntaxRewriter
    {
        public override SyntaxToken VisitToken(SyntaxToken token)
        {
            return token
                .WithLeadingTrivia(RemoveCommentsAndRedundantTrailingWhitespace(token.LeadingTrivia))
                .WithTrailingTrivia(RemoveCommentsAndRedundantTrailingWhitespace(token.TrailingTrivia));
        }
 
        private SyntaxTriviaList RemoveCommentsAndRedundantTrailingWhitespace(SyntaxTriviaList oldTriviaList)
        {
            var newTriviaList = new List<SyntaxTrivia>();
            for (var i = 0; i < oldTriviaList.Count; ++i)
            {
                var isComment =
                    oldTriviaList[i].Kind() == SyntaxKind.SingleLineCommentTrivia ||
                    oldTriviaList[i].Kind() == SyntaxKind.MultiLineCommentTrivia;
 
                var isRedundantWhitespace =
                    i + 1 < oldTriviaList.Count &&
                    oldTriviaList[i].Kind() == SyntaxKind.WhitespaceTrivia &&
                    oldTriviaList[i + 1].Kind() == SyntaxKind.EndOfLineTrivia;
 
                if (!isComment && !isRedundantWhitespace)
                {
                    newTriviaList.Add(oldTriviaList[i]);
                }
            }
            return SyntaxFactory.TriviaList(newTriviaList);
        }
    }
}
4
Миниатюры
Удаление комментариев  
3 / 3 / 2
Регистрация: 02.11.2016
Сообщений: 22
06.11.2016, 08:24 13
А исходный код ТС прогоните пожалуйста.
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 57
06.11.2016, 15:34  [ТС] 14
можно глупый вопрос?
почему у меня ругается на две эти директивы
C#
1
2
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
надо что-то дополнительно установить?
0
4651 / 3203 / 1365
Регистрация: 09.05.2015
Сообщений: 7,874
06.11.2016, 15:36 15
Цитата Сообщение от Ffel Посмотреть сообщение
А исходный код ТС прогоните пожалуйста.
Там мало того что неполный код, так еще и синтаксически неверный код... Он конечно тоже парсится через Roslyn, но не полностью (из последней строки ничего не удалилось).
0
Миниатюры
Удаление комментариев  
4651 / 3203 / 1365
Регистрация: 09.05.2015
Сообщений: 7,874
06.11.2016, 15:37 16
Цитата Сообщение от ner94 Посмотреть сообщение
надо что-то дополнительно установить?
.NET Compiler Platform SDK.
0
Эксперт .NET
8643 / 6104 / 1017
Регистрация: 21.01.2016
Сообщений: 23,031
06.11.2016, 15:37 17
ner94, собирать проект под .NET 4.5.1 или выше, добавить в проект ссылки на соответствующие сборки.
0
900 / 656 / 318
Регистрация: 23.10.2016
Сообщений: 1,537
06.11.2016, 15:40 18
Someone007, в последней строке нет комментариев - там незавершённый string
0
4651 / 3203 / 1365
Регистрация: 09.05.2015
Сообщений: 7,874
06.11.2016, 15:58 19
Вот вам целиком проект для дальнейших экспериментов: Click.
0
3 / 3 / 2
Регистрация: 02.11.2016
Сообщений: 22
06.11.2016, 21:18 20
Цитата Сообщение от Someone007 Посмотреть сообщение
Вот вам целиком проект для дальнейших экспериментов: Click.
Это под VS не ниже 2015?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2016, 21:18

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

Шаблон комментариев
Здравствуйте. Читал в одном учебнике по C#, что в Visual Studio можно как-то включить режим...

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

Дизассемблинг mscorlib с сохранением комментариев
Ребята,видел у кого исходники с комментариями. Юзал DisС# = обычные исходники. Так вот. У...

Генератор комментариев для документации
Есть какие-либо плагины для MSVS2015 для создания подобных комментариев? /// &lt;summary&gt; ///...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.