it-swarm.com.ru

Как устранить ВСЕ разрывы строк в строке?

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

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

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

40
IamDeveloper

Ниже приведен метод расширения, решающий мою проблему. 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);
}
59
IamDeveloper

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

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

22
Tremmors

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

13
Ed Bayiates

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

data = Regex.Replace(data, @"\s+", " ");
9
csharptest.net

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

7
nothrow

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

4
Josh

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

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
Robert Iver

Проверьте эту ссылку: 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\[email protected]]", ""); 
    }
1
BBC

Предполагая, что 8232 является Unicode, вы можете сделать это:

value.Replace("\u2028", string.Empty);
0
Icemanind

лично я бы пошел с 

    public static String RemoveLineEndings(this String text)
    {
        StringBuilder newText = new StringBuilder();
        for (int i = 0; i < text.Length; i++)
        {
            if (!char.IsControl(text, i))
                newText.Append(text[i]);
        }
        return newText.ToString();
    }
0
Manatherin

Вот несколько быстрых решений с .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 demo .

0
Wiktor Stribiżew

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

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

0
Mahmoud Maghrabi