Эффективное удаление всех пустых строк из многострочной строки - PullRequest
30 голосов
/ 19 мая 2010

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

РЕДАКТИРОВАТЬ: я должен добавить, что я использую .NET 2.0.


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

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

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

Ответы [ 19 ]

1 голос
/ 09 февраля 2013

если это только пробелы, почему бы вам не использовать строковый метод C #

    string yourstring = "A O P V 1.5";
    yourstring.Replace("  ", string.empty);

результат будет "AOPV1.5"

1 голос
/ 19 мая 2010
string corrected = 
    System.Text.RegularExpressions.Regex.Replace(input, @"\n+", "\n");
0 голосов
/ 30 декабря 2011

Э. Ну, после всего этого, я не смог найти тот, который поразил бы все угловые случаи, которые я мог выяснить. Вот мое последнее заклинание регулярного выражения, которое удаляет

  1. Все пустые строки от начала строки
    • Не включая пробелы в начале первой строки без пробелов
  2. Все пустые строки после первой строки без пробелов и до последней строки без пробелов
    • Опять же, сохраняя все пробелы в начале любой непробельной строки
  3. Все пустые строки после последней строки без пробелов, включая последнюю новую строку

(<= (\ г \ п) |? ^) \ С * \ г \ п | \ г \ п \ S * $ </p>

что по сути говорит:

  • Сразу после
    • начало строки ИЛИ
    • Конец последней строки
  • Подберите как можно больше непрерывных пробелов, чтобы заканчивалось символом новой строки *
  • OR
  • Соответствует новой строке и как можно большему количеству непрерывных пробелов, чтобы заканчивалось концом строки

Первая половина перехватывает все пробелы в начале строки до первой строки без пробелов или все пробелы между строками без пробелов. Вторая половина захватывает оставшиеся пробелы в строке, включая новую строку последней строки без пробелов.

Спасибо всем, кто пытался помочь; Ваши ответы помогли мне продумать все, что мне нужно было учитывать при сопоставлении.

* (Это регулярное выражение рассматривает новую строку как \r\n, поэтому его необходимо будет корректировать в зависимости от источника строки. Не нужно устанавливать никаких опций для запуска совпадения.)

0 голосов
/ 14 декабря 2011

Вот что-то простое, если работать против каждой отдельной строки ...

(^\s+|\s+|^)$
0 голосов
/ 19 мая 2010
char[] delimiters = new char[] { '\r', '\n' };
string[] lines = value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
string result = string.Join(Environment.NewLine, lines)
0 голосов
/ 23 мая 2014

Удлинение строки

public static string UnPrettyJson(this string s)
{
    try
    {
        // var jsonObj = Json.Decode(s);
        // var sObject = Json.Encode(value);   dont work well with array of strings c:['a','b','c']

        object jsonObj = JsonConvert.DeserializeObject(s);
        return JsonConvert.SerializeObject(jsonObj, Formatting.None);
    }
    catch (Exception e)
    {
        throw new Exception(
            s + " Is Not a valid JSON ! (please validate it in http://www.jsoneditoronline.org )", e);
    }
}
0 голосов
/ 19 мая 2010

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

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

string result = s.Replace(Environment.NewLine, String.Empty);
Console.WriteLine(result);
0 голосов
/ 12 ноября 2018

Я не уверен, что это эффективно, но =)

  List<string> strList = myString.Split(new string[] { "\n" }, StringSplitOptions.None).ToList<string>();
  myString = string.Join("\n", strList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList());
0 голосов
/ 19 мая 2010
s = Regex.Replace(s, @"^[^\n\S]*\n", "");

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

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

И если вы хотите, чтобы он перехватывал последнюю строку, без финального перевода строки:

s = Regex.Replace(s, @"^[ \t\r]*\n?", "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...