Подтвердить что ты не робот

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

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

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

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

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

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

EDIT # 1:

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

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

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

Edit # 2

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

4b9b3361

Ответ 1

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

Ответ 2

В соответствии с 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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Посмотрите эту ссылку: 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]]", ""); 
    }

Ответ 10

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

    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();
    }

Ответ 11

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

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