Код ниже (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)
{
????
}
}
Как вам такое решение? Делить строку, а потом с помощью 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"
Раз речь пошла про 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);
Если уж идти по тому пути что ты начала:
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
Вот пример как это можно сделать без регулярок
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();
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
нужно генерировать HTML страницу на сервере по заданным данным, что бы после отправить человеку email с прикреплённой html формой
Пробовал уже многие варианты, но ничего не работаетВот последняя догадка:
Надо сделать интервал из которого программа будет сама задавать значение и потом чтобы при проверке если не подошло значение ,то программа...
Нужен аналогический метод к tcpListenerPending() но в классе Socket