查找文本注释并使用正则表达式替换它们

时间:2019-06-24 11:24:17

标签: c# regex

我目前要遍历所有源文件,并使用File.ReadAllLines阅读它们的文本,我想用一个正则表达式过滤所有注释。基本上所有评论的可能性。我尝试了几种在互联网上找到的正则表达式解决方案。就这样:

@"(@(?:""[^""]*"")+|""(?:[^""\n\\]+|\\.)*""|'(?:[^'\n\\]+|\\.)*')|//.*|/\*(?s:.*?)\*/"

和当我用谷歌搜索时的最高结果:

string blockComments = @"/\*(.*?)\*/";
string lineComments = @"//(.*?)\r?\n";
string strings = @"""((\\[^\n]|[^""\n])*)""";
string verbatimStrings = @"@(""[^""]*"")+";

请参阅:Regex to strip line comments from C#

第二种解决方案无法识别任何评论。

那是我目前正在做的

public static List<string> FormatList(List<string> unformattedList, string dataType)
{
    List<string> formattedList = unformattedList;

    string blockComments = @"/\*(.*?)\*/";
    string lineComments = @"//(.*?)\r?\n";
    string strings = @"""((\\[^\n]|[^""\n])*)""";
    string verbatimStrings = @"@(""[^""]*"")+";

    string regexCS = blockComments + "|" + lineComments + "|" + strings + "|" + verbatimStrings;
    //regexCS = @"(@(?:""[^""]*"")+|""(?:[^""\n\\]+|\\.)*""|'(?:[^'\n\\]+|\\.)*')|//.*|/\*(?s:.*?)\*/";
    string regexSQL = "";

    if (dataType.Equals("cs"))
    {
        for(int i = 0; i < formattedList.Count;i++)
        {
            string line = formattedList[i];
            line = line.Trim(' ');

            if(Regex.IsMatch(line, regexCS))
            {
                line = "";
            }

            formattedList[i] = line;
        }
    }
    else if(dataType.Equals("sql"))
    {

    }
    else
    {
        throw new Exception("Unknown DataType");
    }

    return formattedList;
}

第一个方法可以识别注释,但也可以找到

string[] bla = text.Split('\\\\');

这个问题有解决方案吗?正则表达式排除字符串/字符中的匹配项吗?如果您还有其他链接我应该退房,请告诉我!

我尝试了很多,无法弄清楚为什么这对我不起作用。

[我也尝试过这些链接]

https://blog.ostermiller.org/find-comment

https://codereview.stackexchange.com/questions/167582/regular-expression-to-remove-comments

Regex to find comment in c# source file

1 个答案:

答案 0 :(得分:0)

如评论中所述,使用正则表达式很难做到这一点。但是,消除评论的一种好方法是利用CSharpSyntaxWalker。语法行者知道所有语言的构造,并且不会像正则表达式那样费劲地调查错误。

添加对Microsoft.CodeAnalysis.CSharp Nuget包的引用,并从CSharpSyntaxWalker继承。

class CommentWalker : CSharpSyntaxWalker
{
    public CommentWalker(SyntaxWalkerDepth depth = SyntaxWalkerDepth.Node) : base(depth)
    {
    }

    public override void VisitTrivia(SyntaxTrivia trivia)
    {
        if (trivia.IsKind(SyntaxKind.MultiLineCommentTrivia)
            || trivia.IsKind(SyntaxKind.SingleLineCommentTrivia))
        {
            // Do something with the comments
            // For example, find the comment location in the file, so you can replace it later.
            // Make a List as a public property, so you can iterate the list of comments later on.
        }
    }
}

然后您可以像这样使用它:

// Get the program text from your .cs file
SyntaxTree tree = CSharpSyntaxTree.ParseText(programText);
CompilationUnitSyntax root = tree.GetCompilationUnitRoot();

var walker = new CommentWalker();
walker.Visit(root);

// Now iterate your list of comments (probably backwards) and remove them.

进一步阅读: