Найти комментарии в тексте и заменить их с помощью Regex - PullRequest
0 голосов
/ 24 июня 2019

В настоящее время я проверяю все мои исходные файлы и читаю их текст с помощью File.ReadAllLines, и я хочу отфильтровать все комментарии одним регулярным выражением. В основном все возможности комментирования. Я попробовал несколько решений регулярных выражений, которые я нашел в Интернете. Как этот:

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

И лучший результат, когда я Google:

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

См .: Regex для удаления комментариев строки из 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 для поиска комментария в исходном файле c #

1 Ответ

0 голосов
/ 24 июня 2019

Делать это с регулярными выражениями будет очень сложно, как указано в комментариях. Тем не менее, хорошим способом устранения комментариев было бы использование CSharpSyntaxWalker. Syntaxwalker знает обо всех языковых конструкциях и не усложняет расследование ошибок (как это делают регулярные выражения).

Добавить ссылку на пакет Nuget Microsoft.CodeAnalysis.CSharp и наследовать от 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.

Дальнейшее чтение:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...