@samsungovetch

C# — Как удалить символ из строки при посимвольной обработке строки в цикле?

Допустим, дана строка "ab+0.1973-1.1"

Она обрабатывается посимвольно через foreach. Нужно удалить из каждой группы идущих подряд цифр, в которой более двух цифр и которой предшествует точка, все цифры, начиная с третьей.

С помощью чего это делается? Находил способ удаления символов до определенного знака, но тут определенного знака нет, т.к. может быть дана строка например "ab+0.1973+1.1" и уже не сработает.
  • Вопрос задан
  • 5382 просмотра
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Проще всего использовать регулярные выражения, если это допустимо:
string value = "ab+0.1973-1.1";
string result = Regex.Replace(value, @"(\.\d{2})\d+", "$1");

Если использовать цикл, то нужно создавать новую строку, но вместо string лучше использовать StringBuilder, т.к. при добавлении данных к string строка постоянно будет пересоздаваться, что в конечном итоге может негативно отразиться на производительности:

string inputString = "ab+0.1973-1.1";
var result = new StringBuilder();
bool hasDot = false;
int digits = 0;

foreach(char ch in inputString)
{
  if (char.IsDigit(ch) && hasDot)
  {
    digits++;
  }
  else
  {
    digits = 0;
    hasDot = (ch == '.');
  }

  if (digits <= 2)
  {
    result.Append(ch);
  }
}

Console.WriteLine(result.ToString());

Если хорошо подумать и если это допустимо, то задачу можно решить с одним только StringBuilder (одним экземпляром), в котором изначально будет строка для обработки, используя метод Remove для удаления ненужных данных. При такой реализации, будет использоваться цикл for.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Исходную строку не трогать, а формировать новую посимвольно. Удаляемые символы можно отмечать булевыми флажками (переменными). То бишь, пока помечено флажком, пропускать, не копируя символы в целевую строку.
Ответ написан
Комментировать
@slayez
Запустить цикл с последнего элемента, а не с первого
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы