Каков самый простой способ в C # обрезать новую строку из строки?


115

Я хочу убедиться, что _content не заканчивается символом NewLine:

_content = sb.ToString().Trim(new char[] { Environment.NewLine });

но приведенный выше код не работает, поскольку Trim, похоже, не имеет перегруженного параметра для коллекции строк, только символы.

Как проще всего удалить Enivronment.Newline с конца строки?


4
кстати, вы, вероятно, хотите TrimEnd
Марк

Ответы:


260

Следующее работает для меня.

sb.ToString().TrimEnd( '\r', '\n' );

или

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());

очень кратко и касается проблемы, приятно
Эдвард Тангуай,

1
Хотя обрезка ЛЮБОЙ комбинации символов, составляющих новую строку (символы), действительно решает основную проблему и суть вопроса, она также оставляет потенциал для нежелательной функциональности в общем смысле. В Senario обработки файлов я мог видеть необходимость оставить первый \ n нетронутым в строке HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Хотя ответ Джона Скита более подробен, он, вероятно, лучший, и ReadLine Скотта Вайнштейна также более «точен» (хотя, возможно, и с немного большими накладными расходами)
b_levitt

26
TrimEnd () уже выполняет задание без каких-либо параметров! msdn.microsoft.com/de-de/library/… и msdn.microsoft.com/de-de/library/…
Маркус

3
@Markus Спасибо, я нашел это, потому что я не хочу такого поведения, но испытывал это. У меня создалось впечатление, что \ n это не пустое пространство, но оно есть и .TrimEnd и .Trim Очистить все символы пробелов изначально
Дэвид Карриган,


14

Как насчет:

public static string TrimNewLines(string text)
{
    while (text.EndsWith(Environment.NewLine))
    {
        text = text.Substring(0, text.Length - Environment.NewLine.Length);
    }
    return text;
}

Это несколько неэффективно, если есть несколько символов новой строки, но это сработает.

В качестве альтернативы, если вы не против обрезки (скажем) "\r\r\r\r"или, "\n\n\n\n"скорее, чем просто "\r\n\r\n\r\n":

// No need to create a new array each time
private static readonly char[] NewLineChars = Environment.NewLine.ToCharArray();

public static string TrimNewLines(string text)
{
    return text.TrimEnd(NewLineChars);
}

1
Наверное, самое точное решение, но не однострочное :-)
bang

9

Используйте Framework. Метод ReadLine () может сказать следующее:

Строка определяется как последовательность символов, за которой следует перевод строки ("\ n"), возврат каретки ("\ r") или возврат каретки, за которым сразу следует перевод строки ("\ r \ n"). Возвращаемая строка не содержит завершающего возврата каретки или перевода строки.

Итак, следующее поможет

_content = new StringReader(sb.ToString()).ReadLine();

1
Да, элегантно, но непросто для понимания другими, читающими эту строку. Требуется поясняющий комментарий (в той же строке, конечно, чтобы остаться однострочным :))
gumo

1
Не работает, если в строке больше одной строки, и вы хотите удалить только последнюю пустую строку.
Флориан Бергер

6

Что о

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());

Это не совсем то же самое - например, будет обрезано "abc \ n \ n \ n \ n \ n", даже если Environment.NewLine - crlf
Марк

1
Объявите это как фичу :-) Решение мне нравится.
Стефан Штайнеггер,

5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Это, конечно, удалит «\ r \ r \ r \ r», а также «\ n \ n \ n \ n» и другие комбинации. И в "средах", где NewLine отличается от "\ n \ r", вы можете получить странное поведение :-)

Но если вы можете смириться с этим, я считаю, что это наиболее эффективный способ удалить символы новой строки в конце строки.


3

Как насчет только:

string text = sb.ToString().TrimEnd(null)

Это приведет к извлечению всех пробелов из конца строки - проблема только в том случае, если вы хотите сохранить пробелы, отличные от новой строки.


1

В некотором смысле это не ответ, но самый простой способ обрезать новую строку в строке - это вообще не иметь новой строки в строке, убедившись, что ваш собственный код никогда не видит ее. То есть с помощью собственных функций, удаляющих новую строку. Многие методы stream и file / io не будут включать новую строку, если вы запрашиваете вывод построчно, хотя может потребоваться обернуть что-то в System.IO.BufferedStream.

Такие вещи, как System.IO.File.ReadAllLinesмогут использоваться вместо System.IO.File.ReadAllTextбольшей части времени, и ReadLineмогут использоваться вместо того, Readкогда вы работаете с правильным типом потока (например, BufferedStream).


0

Как отметил Маркус, TrimEnd сейчас выполняет свою работу. Мне нужно было получить перевод строки и пробелы с обоих концов строки в среде Windows Phone 7.8. После погони за различными более сложными опциями моя проблема была решена с помощью только Trim () - успешно прошла следующие тесты

   [TestMethod]
    [Description("TrimNewLines tests")]
    public void Test_TrimNewLines()
    {
        Test_TrimNewLines_runTest("\n\r     testi    \n\r", "testi");
        Test_TrimNewLines_runTest("\r     testi    \r", "testi");
        Test_TrimNewLines_runTest("\n     testi    \n", "testi");
        Test_TrimNewLines_runTest("\r\r\r\r\n\r     testi   \r\r\r\r \n\r", "testi");
        Test_TrimNewLines_runTest("\n\r  \n\n\n\n   testi äål.,    \n\r", "testi äål.,");
        Test_TrimNewLines_runTest("\n\n\n\n     testi  ja testi  \n\r\n\n\n\n", "testi  ja testi");
        Test_TrimNewLines_runTest("", "");
        Test_TrimNewLines_runTest("\n\r\n\n\r\n", "");
        Test_TrimNewLines_runTest("\n\r \n\n \n\n", "");
    }

    private static void Test_TrimNewLines_runTest(string _before, string _expected)
    {
        string _response = _before.Trim();
        Assert.IsTrue(_expected == _response, "string '" + _before + "' was translated to '" + _response + "' - should have been '" + _expected + "'");
    }

-2

Мне пришлось удалить новые строки по всему тексту. Итак, я использовал:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }

1
Это будет катастрофой, если текст будет содержать NewLine (s), которых нет в конце.
Стефан Бергфельдт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.