Удаление всех пробельных строк от многострочной строки эффективно

В C#, что лучший способ состоит в том, чтобы удалить пустые строки т.е. строки, которые содержат только пробел от строки? Я рад использовать Regex, если это - лучшее решение.

Править: Я должен добавить, что использую.NET 2.0.


Обновление щедрости: я буду откатывать это после того, как щедрость будет награждена, но я хотел разъяснить несколько вещей.

Во-первых, любой Perl 5 compat regex будет работать. Это не ограничено разработчиками.NET. Заголовок и теги были отредактированы для отражения этого.

Во-вторых, в то время как я дал быстрый пример в деталях щедрости, это не единственный тест, который необходимо удовлетворить. Ваше решение должно удалить все строки, которые состоят из только пробела, а также последней новой строки. Если существует строка, которая, после пробежки Вашего regex, заканчивается "/r/n" или любыми пробельными символами, это перестало работать.

30
задан orad 10 March 2017 в 18:54
поделиться

10 ответов

Если вы хотите удалить строки, содержащие любые пробелы (табуляции, пробелы), попробуйте:

string fix = Regex.Replace(original, @"^\s*$\n", string.Empty, RegexOptions.Multiline);

Изменить (для @Will): простейшим решением для обрезки завершающих символов новой строки было бы использовать TrimEnd в результирующая строка, например:

string fix =
    Regex.Replace(original, @"^\s*$\n", string.Empty, RegexOptions.Multiline)
         .TrimEnd();
20
ответ дан 27 November 2019 в 23:33
поделиться
string corrected = 
    System.Text.RegularExpressions.Regex.Replace(input, @"\n+", "\n");
1
ответ дан 27 November 2019 в 23:33
поделиться

Я выберу:

  public static string RemoveEmptyLines(string value) {
    using (StringReader reader = new StringReader(yourstring)) {
      StringBuilder builder = new StringBuilder();
      string line;
      while ((line = reader.ReadLine()) != null) {
        if (line.Trim().Length > 0)
          builder.AppendLine(line);
      }
      return builder.ToString();
    }
  }
1
ответ дан 27 November 2019 в 23:33
поделиться
string outputString;
using (StringReader reader = new StringReader(originalString)
using (StringWriter writer = new StringWriter())
{
    string line;
    while((line = reader.ReadLine()) != null)
    {
        if (line.Trim().Length > 0)
            writer.WriteLine(line);
    }
    outputString = writer.ToString();
}
16
ответ дан 27 November 2019 в 23:33
поделиться

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

public static string RemoveEmptyLines(this string text) {
    var builder = new StringBuilder();

    using (var reader = new StringReader(text)) {
        while (reader.Peek() != -1) {
            string line = reader.ReadLine();
            if (!string.IsNullOrWhiteSpace(line))
                builder.AppendLine(line);
        }
    }

    return builder.ToString();
}

Примечание. Метод IsNullOrWhiteSpace является новым в .NET 4.0 . Если у вас его нет, просто написать самостоятельно:

public static bool IsNullOrWhiteSpace(string text) {
    return string.IsNullOrEmpty(text) || text.Trim().Length < 1;
}
1
ответ дан 27 November 2019 в 23:33
поделиться
s = Regex.Replace(s, @"^[^\n\S]*\n", "");

[^\n\S] соответствует любому символу, который не является символом перевода строки или символом, не являющимся пробелом - таким образом, любой символ пробела, кроме \n. Но, скорее всего, единственными символами, о которых вам нужно беспокоиться, являются пробел, табуляция и возврат каретки, так что это тоже должно работать:

s = Regex.Replace(s, @"^[ \t\r]*\n", "");

А если вы хотите, чтобы он отлавливал последнюю строку без завершающего символа перевода строки:

s = Regex.Replace(s, @"^[ \t\r]*\n?", "");
-2
ответ дан 27 November 2019 в 23:33
поделиться

Попробуйте это.

string s = "Test1" + Environment.NewLine + Environment.NewLine + "Test 2";
Console.WriteLine(s);

string result = s.Replace(Environment.NewLine, String.Empty);
Console.WriteLine(result);
-1
ответ дан 27 November 2019 в 23:33
поделиться

с моей головы...

string fixed = Regex.Replace(input, "\s*(\n)","$1");

превращает это:

fdasdf
asdf
[tabs]

[spaces]  

asdf


в это:

fdasdf
asdf
asdf
13
ответ дан 27 November 2019 в 23:33
поделиться
char[] delimiters = new char[] { '\r', '\n' };
string[] lines = value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
string result = string.Join(Environment.NewLine, lines)
0
ответ дан 27 November 2019 в 23:33
поделиться

Использование LINQ:

var result = string.Join("\r\n",
                 multilineString.Split(new string[] { "\r\n" }, ...None)
                                .Where(s => !string.IsNullOrWhitespace(s)));

Если вы имеете дело с большими входными данными и / или несогласованными окончаниями строк, вам следует использовать StringReader и вместо этого выполнить описанную выше старую школу с циклом foreach.

8
ответ дан 27 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: