C # удаление комментариев из строки - PullRequest
1 голос
/ 06 декабря 2011

Я использую WinForms NET 2.0. Я кодирую небольшую функцию, чтобы обрезать комментарии из некоторого выделенного текста. Для этого выделенный текст разбивается на отдельные строки, а затем:

  • Если строка не содержит комментариев, она добавляется.
  • Если в строке содержится какой-то текст, за которым следуют комментарии, к нему добавляются обрезанные комментарии.
  • Если строка начинается с комментария, она не добавляется. Это в операторе if.
  • Если строка пуста, она не добавляется. Это также в операторе if.

Вот мой код:

        string[] lines = tb.SelectedText.Split('\n');
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < lines.Length; i++)
        {
            if ((lines[i].Trim() != string.Empty) || !Regex.IsMatch(lines[i], @"^\s*;(.*)$"))
            {
                if (Regex.IsMatch(lines[i], @"^(.*);(.*)$"))
                    sb.AppendLine(lines[i].Substring(0, lines[i].IndexOf(';')).Trim());
                else
                    sb.AppendLine(lines[i]);
            }
        }
        tb.SelectedText = sb.ToString();

Проблема в том, что она работает не так, как задумано. Предположим, у меня есть следующий текст:

test    ;test

test2   ;test

Я ожидал бы, что это обрежет комментарии и удалит пустую строку, но нет, пустая строка все еще там. Почему это? Я проверил, была ли строка пустой, поэтому StringBuilder не должен добавлять строку, если она пустая, но по какой-то причине это происходит.

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

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Заменить ||в операторе if от && и использовать "\ r \ n" вместо "\ n".Попробуйте это:

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

for (int i = 0; i < lines.Length; i++)
{
    var line = lines[i].Trim();
    if ((line != string.Empty) && !Regex.IsMatch(line, @"^\s*;(.*)$"))
    {
        if (Regex.IsMatch(line, @"^(.*);(.*)$"))
            sb.AppendLine(line.Substring(0, line.IndexOf(';')).Trim());
        else
            sb.AppendLine(line);
    }
}
textBox2.SelectedText = sb.ToString();

Или с LinQ и выражением "?:":

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

foreach (var line in lines.Select(t => t.Trim())
                          .Where(line => (line != string.Empty) && !Regex.IsMatch(line, @"^\s*;(.*)$")))
{
    sb.AppendLine(Regex.IsMatch(line, @"^(.*);(.*)$") ? line.Substring(0, line.IndexOf(';')).Trim() : line);
}
textBox2.SelectedText = sb.ToString();
1 голос
/ 06 декабря 2011

У вас проблема с логикой здесь

if ((lines[i].Trim() != string.Empty) || !Regex.IsMatch(lines[i], @"^\s*;(.*)$")) {
    if (Regex.IsMatch(lines[i], @"^(.*);(.*)$"))
        sb.AppendLine(lines[i].Substring(0, lines[i].IndexOf(';')).Trim());
    else
        sb.AppendLine(lines[i]);
}

Вы вводите if, когда строка не пуста ИЛИ , она не соответствует регулярному выражению. Это означает, что вы вводите его все время, потому что, когда первая часть ложна (строка пуста), тогда вторая - истина (пустая строка не соответствует вашему регулярному выражению.)

Просто замените ИЛИ на AND.

...