Я хотел бы заменить каждый символ не цифра в строке на космический персонаж.
Например: "123X456Y78W9" -> "123 456 78 9"
Единственное решение, которое я разработал, находится здесь:
string input = "123X456Y78W9";
string output = "";
foreach (char c in input)
if (c in (1, 2, 3, 4, 5, 6, 7, 8, 9, 0))
output += c;
else
output += ' ';
Есть ли более простое решение?
Использование регулярного выражения может быть проще, но, скорее всего, с меньшей производительностью (за исключением того, что реализация регулярного выражения очень умна и обнаруживает, что это очень специальное и простое регулярное выражение, чем может быть реализовано, например, просмотром таблицы поиска во время итерации строки (может даже быть делается на месте, если используется изменяемый тип данных))





Вы можете использовать Regex.Replace() с классом символов, состоящим из всех нецифр.
string output = Regex.Replace(input, @"\D", @" ");
Вы можете поставить более короткий шаблон @"\D" вместо @"[^\d]", так как \D означает не цифра
@DmitryBychenko: Верно. Я забыл об этом. Спасибо, ответ отредактирован.
Примечание: @"\D" означает не любой юникод цифры (не только 0..9, но и многие другие, например, персидские - ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹). Если нужно сохранить только 0..9, добавьте RegexOptions.ECMAScript в качестве последнего параметра: Regex.Replace(input, @"\D", " ", RegexOptions.ECMAScript);
Линк является альтернативой регулярные выражения:
string input = "123X456Y78W9";
string output = string.Concat(input.Select(c => c >= '0' && c <= '9' ? c : ' '));
Или если вы хотите сохранить все цифры юникода (скажем, персидский - ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹)
string output = string.Concat(input.Select(c => char.IsDigit(c) ? c : ' '));
Linq — это альтернатива более читаемый регулярным выражениям, что подтверждается разницей между верхним и нижним регистром d в ответе липкого бита.
Какая кодировка? ASCII или UTF8 или...