我需要执行一个删除文本(代码)中所有注释的功能。我的代码快要完成了,但是如果注释在文件的第一行开始,它就行不通了。它说索引超出范围,我尝试将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
答案 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 但是在循环内部,您正在缩短文本。在某些时候它比原点文本要小。长度不足,我猜不到索引