Удалить многострочные комментарии только из верхней части каждого файла Java - PullRequest
0 голосов
/ 10 ноября 2018

Мы однажды использовали инструмент Borland Starteam (одна из разновидностей системы контроля версий / исходного кода, например, Mercurial) для управления кодом. Всякий раз, когда мы фиксируем код, инструмент сам помещает описание фиксации вверху файла. Так что теперь у нас есть много классов в коде в верхней части каждого файла. Например:

/*This is some developer comment at the top of the file*/

/*
 * $Log:
 *  1   Client Name 1.0   07/11/2012 16:28:54  Umair Khalid did something
 *  2   Client Name 1.0   07/11/2012 16:28:54  Umair Khalid again did 
 *                                             something
 * $
 */

public class ABC
{
  /*This is just a variable*/
  int a = 0;
  public int method1()
  {
  }
}

Теперь я планирую удалить весь этот тип кода starteam, который присутствует вверху каждого файла. Но я не хочу удалять любой другой комментарий из любого файла или любой другой комментарий об авторских правах в верхней части. Я хочу удалить только тот чанк, который начинается с $ Log и заканчивается на $. Я также рассмотрел другие вопросы, связанные с этой проблемой, но это многострочный комментарий. Будет ли регулярное выражение хорошим вариантом для этого?

Есть ли какая-нибудь утилита, которую я могу использовать вместо написания собственного кода, чтобы удалить это?

Если регулярное выражение - единственное быстрое решение, то я застрял там.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 10 ноября 2018

Если формат, как вы показываете, равен точно , вы можете создать небольшой хрупкий конечный автомат, который выглядит следующим образом.

Начните с перечисления для отслеживания состояния:

enum ParseState
{
    Normal,
    MayBeInMultiLineComment,    //occurs after initial /*
    InMultilineComment,
}

и затем добавьте этот код:

     public static void CommentStripper()
     {
         var text = @"/*This is some developer comment at the top of the file*/
/*
 * $Log:
 *  1   Client Name 1.0   07/11/2012 16:28:54  Umair Khalid did something
 *  2   Client Name 1.0   07/11/2012 16:28:54  Umair Khalid again did 
 *                                             something
 * $
 */

/*
    This is not a log entry
*/

public class ABC
{
  /*This is just a variable*/
  int a = 0;
  public int method1()
  {
  }
}";

    //this next line could be File.ReadAllLines to get the text from a file
    //or you could read from a stream, line by line.

    var lines = text.Split(new[] {"\r\n"}, StringSplitOptions.None);

    var buffer = new StringBuilder();
    ParseState parseState = ParseState.Normal;
    string lastLine = string.Empty;

    foreach (var line in lines)
    {
        if (parseState == ParseState.Normal)
        {
            if (line == "/*")
            {
                lastLine = line;
                parseState = ParseState.MayBeInMultiLineComment;
            }
            else
            {
                buffer.AppendLine(line);
            }
        }
        else if (parseState == ParseState.MayBeInMultiLineComment)
        {
            if (line == " * $Log:")
            {
                parseState = ParseState.InMultilineComment;
            }
            else
            {
                parseState = ParseState.Normal;
                buffer.AppendLine(lastLine);
                buffer.AppendLine(line);
            }
            lastLine = string.Empty;
        }
        else if (parseState == ParseState.InMultilineComment)
        {
            if (line == " */")
            {
                parseState = ParseState.Normal;
            }
        }

    }
    //you could do what you want with the string, I'm just going to write it out to the debugger console.
    Debug.Write(buffer.ToString());
}

Обратите внимание, что lastLine используется, потому что вам нужно прочитать одну строку вперед, чтобы определить, является ли комментарий записью в журнале (или это то, что отслеживает состояние MayBeInMultiLineComment).

Вывод из этого выглядит следующим образом:

/*This is some developer comment at the top of the file*/


/*
    This is not a log entry
*/

public class ABC
{
  /*This is just a variable*/
  int a = 0;
  public int method1()
  {
  }
}
...