函数,删除所有代码注释

时间:2018-11-16 12:56:14

标签: c# algorithm function comments

我需要执行一个删除文本(代码)中所有注释的功能。我的代码快要完成了,但是如果注释在文件的第一行开始,它就行不通了。它说索引超出范围,我尝试将for循环更改为从1开始,然后从if更改为(text[i] == '/' && text[i - 1] == '/'),但此操作无效。 任何建议,由于它看起来很奇怪,我该如何解决或改善代码。

public void RemoveComments(string text)
        {
            for (int i = 0; i < text.Length; i++)
            {
                if (text[i] == '/' && text[i + 1] == '/')
                {
                    text = text.Remove(i, 2);
                    for (int j = i; j < text.Length; j++)
                    {
                        if (text[j] != '\n')
                        {
                            text = text.Remove(j, 1);
                            j--;
                        }
                        else if (text[j] == '\n')
                        {
                            text = text.Remove(j, 1);
                            j--;
                            while (text[j] == ' ')
                            {
                                text = text.Remove(j, 1);
                                j--;
                            }
                            i = j;
                            break;
                        }
                    }
                }

                else if (text[i] == '/' && text[i + 1] == '*')
                {
                    text = text.Remove(i, 2);
                    for (int j = i; j < text.Length; j++)
                    {
                        if (text[j] != '*' && text[j + 1] != '/')
                        {
                            text = text.Remove(j, 1);
                            j--;
                        }

                        else if (text[j] == '*' && text[j + 1] == '/')
                        {
                            text = text.Remove(j, 2);
                            j = j - 2;
                            while (text[j] == ' ')
                            {
                                text = text.Remove(j, 1);
                                j--;
                                if (text[j] == '\n')
                                {
                                    text = text.Remove(j, 1);
                                    j--;
                                }
                            }
                            i = j;
                            break;
                        }

                    }
                }
            }
            Console.WriteLine(text);
        }

编辑:现在我做了很多实验,发现问题出在(//循环中),我需要这个循环来解决一些小问题:

while (text[j] == ' ')
{
    text = text.Remove(j, 1);
    j--;
}

Test.txt文件。

//int a;
int c; //int d;
Console.Write/*Line*/("Hhehehe");
if(1>0)
/*ConsoleWriteLine("Yes")*/
//Nooo

2 个答案:

答案 0 :(得分:2)

好像您有C#代码文件。因此,您可以使用Roslyn的幂。只需将代码文件解析为语法树,然后与访客一起访问该树即可跳过注释:

var code = File.ReadAllText("Code.cs");
SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
var root = (CompilationUnitSyntax)tree.GetRoot();
var codeWithoutComments = new CommentsRemover().Visit(root).ToString();
Console.WriteLine(codeWithoutComments);

访问者:

class CommentsRemover : CSharpSyntaxRewriter
{
    public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia)
    {
        switch(trivia.Kind())
        {
            case SyntaxKind.SingleLineCommentTrivia:
            case SyntaxKind.MultiLineCommentTrivia:
                return default;
            default:
                return trivia;                 
        }            
    }
}

示例代码文件:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp
{
    /* Sample
       Multiline Comment */
    class Program
    {
        static void Main(string[] args)
        {
            // Comment
            Console.Write/*Line*/("Hello, World!"); // Print greeting
            /*ConsoleWriteLine("Yes")*/
        }
    }
}

输出:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp
{

    class Program
    {
        static void Main(string[] args)
        {

            Console.Write("Hello, World!");

        }
    }
}

注意:如您所见,从除注释之外的所有行中删除注释后,您将获得空行。您可以再创建一个访客以删除空行。还可以考虑删除XML注释。

答案 1 :(得分:0)

您有一个基于文本的循环。长度

for(int i = 0; i

但是在循环内部,您正在缩短文本。在某些时候它比原点文本要小。长度不足,我猜不到索引