C # Лучший способ заменить x повторяющихся токенов одним токеном - PullRequest
0 голосов
/ 27 августа 2009

Если у меня есть:

Some text



More text






Even more text

Какой самый элегантный способ получить:

Some text

More text

Even more text

Все, зная количество повторных токенов

Ответы [ 9 ]

7 голосов
/ 27 августа 2009

Метод для этого с использованием регулярных выражений будет

string replaced = System.Text.RegularExpressions.Regex
    .Replace(input, @"(?:\r\n)+", "\r\n");

(Синтаксис (?:...) - это группа без захвата, которую можно заменить на группу захвата (просто (...)), но это немного менее эффективно и не более читабельно, IMO.)

6 голосов
/ 27 августа 2009

Возможно что-то вроде:

var result = string.Join("\r\n", s.Split(new[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries))
3 голосов
/ 27 августа 2009

Используйте регулярные выражения. Сопоставьте всю строку '\ r \ n' и замените ее одиночной '\ r \ n'

Функция, которая вам нужна:

pattern = "(\\r\\n)+";
Regex rgx = new Regex(pattern);

newString = rgx.Replace(oldString, "\r\n");

РЕДАКТИРОВАТЬ: Извинения за пропущенный + ранее

1 голос
/ 27 августа 2009

Я не знаю синтаксиса C #, но просто используйте регулярное выражение для замены (\ r \ n) + на (\ r \ n)

0 голосов
/ 27 августа 2009

Всего несколько дней назад здесь, в SO, был почти такой же вопрос. Проблема не в NewLine, а в пробелах.

Был также один парень, который предпочитает метод Split, Join и другой сайт, используя регулярное выражение. Итак, Джон провел сравнение между обоими, и оказалось, что регулярное выражение компиляции было намного быстрее.

Но я просто не могу найти этот вопрос снова ...

0 голосов
/ 27 августа 2009

Самый быстрый способ:

Regex reg = new Regex(@"(\r\n)+");

string replacedString = reg.Replace("YOUR STRING TO BE REPLACED", Environment.NewLine);
0 голосов
/ 27 августа 2009

Без регулярных выражений (от которых у меня болит голова)

string RemoveRepeated(string needle, string haystack)
{
    string doubleNeedle = needle + needle;

    while (haystack.IndexOf(doubleNeedle) >= 0)
        haystack = haystack.Replace(doubleNeedle, needle);
    return haystack;
}

С меньшим выделением памяти

string RemoveRepeated(string needle, string haystack)
{
    if (needle == null)
        throw new ArgumentNullException("needle");

    if (haystack == null)
        throw new ArgumentNullException("haystack");

    if (needle == string.Empty || haystack == string.Empty)
        return haystack;

    string doubleNeedle = needle + needle;
    var buffer = new StringBuilder(haystack);
    int originalLength;
    do
    {
        originalLength = buffer.Length;
        buffer.Replace(doubleNeedle, needle);
    } while (originalLength != buffer.Length);

    return buffer.ToString();
}

Первоначальные проверки одинаково действительны и в первой версии

0 голосов
/ 27 августа 2009

Если \ r \ n означает, что он обычно делает, вы заменяете последовательные пустые строки одной пустой строкой.

Я уверен, что для этого есть инструменты. Я не знал бы о C #, однако.

0 голосов
/ 27 августа 2009

Вы можете использовать регулярное выражение:

str = Regex.Replace(str, "(\r\n)+", "\r\n")

Другим способом может быть разбиение на разрывы строк с удалением пустых записей, а затем присоединение снова:

str = String.Join("\r\n", str.Split(new string[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries);

Подумайте, следует ли использовать строковый литерал "\r\n" или константу Environment.NewLine. Это зависит от того, откуда поступают данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...