Замена символа в строке по его количеству

176
21 июля 2019, 04:10

Код ниже (c# winforms net4.0 vs2010) считает количество повторений символа "Environment.NewLine" в строке "Str". Подскажите пожалуйста, как выполнить следующее: в строке "Str" заменить каждый пятый символ "Environment.NewLine" на пробел. Количество повторений символа "Environment.NewLine" в строке "Str" может быть любое.

Пример: было:

Str = текст + Environment.NewLine + текст + Environment.NewLine + текст + Environment.NewLine + текст + Environment.NewLine + текст + Environment.NewLine + текст + Environment.NewLine ...

должно стать:

Str = текст + Environment.NewLine + текст + Environment.NewLine + текст + Environment.NewLine + текст + Environment.NewLine + текст + " " + текст + Environment.NewLine ...

Спасибо заранее!

Str = Str + '"' + searchString + '"' + Environment.NewLine;
if (Str != "")
{
  int count = 0;
  foreach (Match m in Regex.Matches(Str, Environment.NewLine))
    count++;
  if (count > 1)
  {
    ????
  }
}
Answer 1

Как вам такое решение? Делить строку, а потом с помощью Linq сделать то что нам нужно.

        var str = $"{Environment.NewLine} 1{Environment.NewLine}2{Environment.NewLine}3{Environment.NewLine}4{Environment.NewLine}5{Environment.NewLine}6{Environment.NewLine}7{Environment.NewLine}8{Environment.NewLine}9{Environment.NewLine}10{Environment.NewLine}11{Environment.NewLine}";
        // str = "\r\n 1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n"
        var splitted = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
        string result = string.Empty;
        while(splitted.Any())
        {
            result += string.Join(Environment.NewLine, splitted.Take(5));
            splitted = splitted.Skip(5).ToArray();
        }
        // result = "\r\n 1\r\n2\r\n3\r\n45\r\n6\r\n7\r\n8\r\n910\r\n11\r\n"
Answer 2

Раз речь пошла про LINQ :)

var res = input.Split(new[] { Environment.NewLine }, StringSplitOptions.None)
    .Select((x, i) => (x, i))
    .GroupBy(x => x.i / 5)
    .Select(x => (x.Key, string.Join(Environment.NewLine, x.OrderBy(z=>z.i).Select(z=>z.x))))
    .Aggregate(string.Empty, (a, c)=>a + " " + c.Item2);
Answer 3

Если уж идти по тому пути что ты начала:

        var Str = "";
        var strArr = Str.ToArray();
        var matches = Regex.Matches(Str, Environment.NewLine);
        for (int i = 0; i <= matches.Count; i+=5)
        {
            var origStrIndex = matches[i].Index;
            strArr[origStrIndex] = ' ';
        }
        Str = new String(strArr);

но я не уверен сработает ли с символом переноса строки (это может быть 2 символа....)

Я бы советовал, наверное, все же использовать Regex.Replace как в примере вот здесь: https://stackoverflow.com/questions/47200835/replace-nth-regex-match-occurrence-in-string

Answer 4

Вот пример как это можно сделать без регулярок

string Replace5thNewLine(string input)
{
    var newLineArr = Environment.NewLine.ToCharArray();
    var originalLine = input.ToCharArray(); 
    var newLineCount = 0;
    var ret = new StringBuilder();
    for(var i=0; i<originalLine.Length; i++)
    {
        int j=0; 
        while((j+i)<originalLine.Length && j<newLineArr.Length && originalLine[j+i] == newLineArr[j]) j++;
        var isNewLine = j == newLineArr.Length;     
        if (isNewLine) newLineCount++;
        if (isNewLine && newLineCount % 5 == 0)
        {
            ret.Append(' ');
            i+=newLineArr.Length - 1;
        }
        else 
            ret.Append(originalLine[i]);
    }
    return ret.ToString();
}
READ ALSO
С помощью чего сделать HTML документ? asp.net core

С помощью чего сделать HTML документ? asp.net core

нужно генерировать HTML страницу на сервере по заданным данным, что бы после отправить человеку email с прикреплённой html формой

174
Как сделать движение объекта вверх на определённое количество секунд при срабатывании триггера?

Как сделать движение объекта вверх на определённое количество секунд при срабатывании триггера?

Пробовал уже многие варианты, но ничего не работаетВот последняя догадка:

177
Как использовать интервалы

Как использовать интервалы

Надо сделать интервал из которого программа будет сама задавать значение и потом чтобы при проверке если не подошло значение ,то программа...

196
аналог tcpListener.Pending() в Socket C#

аналог tcpListener.Pending() в Socket C#

Нужен аналогический метод к tcpListenerPending() но в классе Socket

162