删除所有评论(单/多线)&源文件中的空白行

时间:2012-02-02 13:29:25

标签: c# regex comments

如何从C#源文件中删除所有注释和空白行。请记住,可能存在嵌套注释。一些例子:

string text = @"//not a comment"; // a comment

/* multiline
comment */ string newText = "/*not a comment*/"; // a comment

/* multiline // not a comment 
/* comment */ string anotherText = "/* not a comment */ // some text here\"// not a comment"; // a comment

我们可以拥有比上述三个例子更复杂的来源。 有人可以建议使用正则表达式或其他方法来解决这个问题。我已经在互联网上浏览了很多东西,并且找不到任何可行的东西。

7 个答案:

答案 0 :(得分:6)

要删除评论,请参阅this answer。 之后,删除空行是微不足道的。

答案 1 :(得分:3)

您可以使用this answer中的功能:

static string StripComments(string code)
{
    var re = @"(@(?:""[^""]*"")+|""(?:[^""\n\\]+|\\.)*""|'(?:[^'\n\\]+|\\.)*')|//.*|/\*(?s:.*?)\*/";
    return Regex.Replace(code, re, "$1");
}

然后删除空行。

答案 2 :(得分:1)

不幸的是,如果没有边缘情况,使用正则表达式确实很难做到。我没有调查很远,但您可以使用Visual Studio Language Services来解析注释。

答案 3 :(得分:1)

如果你想用正则表达式识别注释,你真的需要使用正则表达式作为标记器。即,它识别并提取字符串中的第一个东西,无论是字符串文字,注释还是既不是字符串文字也不是注释的东西块。然后你抓住字符串的剩余部分并从开头拉出下一个标记。

这可以解决上下文的问题。如果你只是想在字符串中间查找内容,那么就没有好的方法来确定特定的“注释”是否在字符串文字内 - 事实上,很难确定字符串文字的位置首先,因为像\"这样的事情。但是如果你总是把字符串中的第一个东西拿走,那么很容易说“哦,字符串以"开头,所以直到下一个未转义的"的字符串都更多。”上下文照顾自己。

所以你想要三个正则表达式:

  • 用于标识从字符串开头开始的评论(///*评论)。
  • 用于标识从字符串开头开始的字符串文字的字符串。请务必检查"@"字符串;每个都有自己的边缘情况。
  • 识别上述内容之一的内容,并且直到 可以成为评论或字符串文字的第一件事情为止。

编写实际的正则表达式模式是留给读者的练习,因为它需要花费数小时来编写和测试它,我不愿意免费这样做。 (笑)但是它确实可行,如果你对正则表达式有很好的理解(或者有一个像StackOverflow这样的地方在遇到问题时提出具体问题)并且愿意为你的代码编写一堆自动化测试。但要注意最后一个(“其他任何事情”)的情况 - 你想要在@之前停止,如果后面是",但是如果它是@则不要转义关键字以用作标识符。

答案 4 :(得分:1)

另请参阅我的C#代码缩小项目:CSharp-Minifier

除了从代码中删除注释,空格和换行符之外,目前它还能够压缩局部变量名称并进行另一次缩小。

答案 5 :(得分:0)

首先,在构建RegexOptions.SingleLine实例时,您肯定希望使用RegEx。现在,您正在处理单行代码。

要赞美使用RegexOptions.SingleLine选项,您需要确保使用start and end string anchors(分别为^$)。您拥有的案例,您希望正则表达式应用于整个字符串。

我还建议分解条件并使用alternation处理较小的情况,从较小的,易于管理的表达式构建更大的正则表达式。

最后,我知道这是作业,但是使用正则表达式解析软件语言是徒劳的(这不是一个实际应用)。对于更高结构化的数据,它更好。如果你发现将来要做这样的事情,请使用为该语言构建的解析器(在这种情况下,我高度推荐Roslyn)。

答案 6 :(得分:-1)

使用我的项目删除大多数评论。 https://github.com/SynAppsDevelopment/CommentRemover

它删除了所有全行,结束行和XML Doc代码注释,并对自述文件和源代码中解释的复杂注释有一些限制。这是一个带有WinForms接口的C#解决方案。