我目前要遍历所有源文件,并使用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
答案 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.
进一步阅读: