Как устранить ВСЕ разрывы строк в строке? - PullRequest
42 голосов
/ 19 июля 2011

Мне нужно избавиться от всех разрывов строк, которые появляются в моих строках (исходя из БД). Я делаю это, используя код ниже:

value.Replace("\r\n", "").Replace("\n", "").Replace("\r", "")

Я вижу, что как минимум один персонаж, действующий как конец строки, выжил. Код символа: 8232 .

Это очень глупо с моей стороны, но я должен сказать, что это первый раз, когда я с удовольствием вижу этого персонажа. Очевидно, что я могу просто заменить этот символ напрямую, но я думал о расширении моего текущего подхода (основанного на замене комбинаций "\ r" и "\ n") на что-то гораздо более надежное, поэтому он будет включать не только ' 8232 'char, но также и все остальные, пока не найденные мной.

Есть ли у вас пуленепробиваемый подход к такой проблеме?

EDIT # 1:

Мне кажется, что есть несколько возможных решений:

  1. использовать Regex.Replace
  2. удалить все символы, если это IsSeparator или IsControl
  3. заменить на "", если это IsWhiteSpace
  4. создайте список всех возможных окончаний строки ("\ r \ n", "\ r", "\ n", LF, VT, FF, CR, CR + LF, NEL, LS, PS) и просто замените их с пустой строкой. Это много замен.

Я бы сказал, что лучшие результаты будут после применения 1-го и 4-го подходов, но я не могу решить, что будет быстрее. Какой из них вы считаете наиболее полным?

EDIT # 2

Я разместил ответ ниже.

Ответы [ 12 ]

61 голосов
/ 20 июля 2011

Ниже приведен метод расширения, решающий мою проблему. LineSeparator и ParagraphEnding, конечно, могут быть определены где-то еще, как статические значения и т. Д.

public static string RemoveLineEndings(this string value)
{
    if(String.IsNullOrEmpty(value))
    {
        return value;
    }
    string lineSeparator = ((char) 0x2028).ToString();
    string paragraphSeparator = ((char)0x2029).ToString();

    return value.Replace("\r\n", string.Empty)
                .Replace("\n", string.Empty)
                .Replace("\r", string.Empty)
                .Replace(lineSeparator, string.Empty)
                .Replace(paragraphSeparator, string.Empty);
}
23 голосов
/ 19 июля 2011

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

LF: перевод строки, U + 000A
VT: вертикальная вкладка, U + 000B
FF: подача формы, U + 000C
CR: возврат каретки, U + 000D
CR + LF: CR (U + 000D), за которым следует LF (U + 000A)
NEL: Следующая строка, U + 0085
LS: разделитель линий, U + 2028
PS: разделитель абзацев, U + 2029

13 голосов
/ 19 июля 2011

8232 (0x2028) и 8233 (0x2029) - единственные другие, которые вы можете исключить.См. Документацию для char.IsSeparator .

9 голосов
/ 19 июля 2011

Реквизиты Йоссариану на этот раз, я думаю, что он прав. Замените все пробелы одним пробелом:

data = Regex.Replace(data, @"\s+", " ");
7 голосов
/ 19 июля 2011

Я бы рекомендовал удалить ВСЕ пробелы (char.IsWhitespace) и заменить их на один пробел. IsWhiteSpace позаботится обо всех странных юникодных пробелах.

4 голосов
/ 19 июля 2011

Это моя первая попытка, но я думаю, что это сделает то, что вы хотите ...

var controlChars = from c in value.ToCharArray() where Char.IsControl(c) select c;
foreach (char c in controlChars)  
   value = value.Replace(c.ToString(), "");

Также, смотрите эту ссылку для получения подробной информации о других методах, которые вы можете использовать: Методы Char

4 голосов
/ 19 июля 2011

Вы пробовали string.Replace(Environment.NewLine, "")? Это обычно получает их много для меня.

1 голос
/ 19 июля 2011

Проверьте эту ссылку: http://msdn.microsoft.com/en-us/library/844skk0h.aspx

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

static void Main(string[] args)
{

        StringBuilder txt = new StringBuilder();
        txt.Append("Hello \n\n\r\t\t");
        txt.Append( Convert.ToChar(8232));

        System.Console.WriteLine("Original: <" + txt.ToString() + ">");

        System.Console.WriteLine("Cleaned: <" + CleanInput(txt.ToString()) + ">");

        System.Console.Read();

    }

    static string CleanInput(string strIn)
    {
        // Replace invalid characters with empty strings.
        return Regex.Replace(strIn, @"[^\w\.@-]", ""); 
    }
0 голосов
/ 03 августа 2018

Вот несколько быстрых решений с помощью .NET regex:

  • Чтобы удалить любые пробелы из строки: s = Regex.Replace(s, @"\s+", ""); (\s соответствует любым символам пробела Unicode)
  • Чтобы удалить все пробелы, НО CR и LF: s = Regex.Replace(s, @"[\s-[\r\n]]+", ""); ([\s-[\r\n]] - это класс символов, содержащий конструкцию вычитания, он соответствует любому пробелу, кроме CR и LF)
  • Чтобы удалить любой вертикальный пробел, вычтите \p{Zs} (любой горизонтальный пробел, кроме табуляции) и \t (табуляцию) из \s: s = Regex.Replace(s, @"[\s-[\p{Zs}\t]]+", "");.

Завершение последнего в метод расширения:

public static string RemoveLineEndings(this string value)
{
    return Regex.Replace(value, @"[\s-[\p{Zs}\t]]+", "");
}

См. Демоверсию regex .

0 голосов
/ 22 февраля 2017

Если у вас есть строка, скажем «theString», используйте метод Replace и передайте ей аргументы, показанные ниже:

theString = theString.Replace(System.Environment.NewLine, "");

...