如何在C#中限制Console.ReadLine()输入,禁止特殊字符?
在C#中限制Console.ReadLine()的特殊字符输入
当然可以限制输入,有两种常用方案:实时拦截非法字符,或者输入后高效过滤。
方案一:实时拦截(输入时直接禁止非法字符)
这种方式在用户输入时就拦截掉指定的特殊字符,只允许合法字符显示和录入,体验更直观。核心是用Console.ReadKey()逐个处理按键,判断是否属于禁止列表:
Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine($"Please type-in the {reqVariables[h]} of the model below:"); Console.ForegroundColor = ConsoleColor.Magenta; StringBuilder inputBuilder = new StringBuilder(); while (true) { var key = Console.ReadKey(true); // 不自动回显按键,手动控制显示 // 按下回车时结束输入 if (key.Key == ConsoleKey.Enter) { Console.WriteLine(); break; } // 处理退格键,删除已输入的字符 if (key.Key == ConsoleKey.Backspace && inputBuilder.Length > 0) { inputBuilder.Remove(inputBuilder.Length - 1, 1); Console.Write("\b \b"); // 在控制台删除最后一个字符 continue; } // 定义禁止输入的特殊字符集合 char[] forbiddenChars = { '/', '%', '$', '#' }; // 仅当字符合法时,追加到输入并显示 if (!forbiddenChars.Contains(key.KeyChar)) { inputBuilder.Append(key.KeyChar); Console.Write(key.KeyChar); } // 非法字符直接忽略,不做任何处理 } freeTextSerialNumbers = inputBuilder.ToString();
方案二:输入后高效过滤(替代你的Replace方式)
如果觉得实时拦截逻辑稍复杂,也可以在用户输入完成后统一过滤,相比多次调用Replace(),用LINQ筛选合法字符更高效:
Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine($"Please type-in the {reqVariables[h]} of the model below:"); Console.ForegroundColor = ConsoleColor.Magenta; freeTextSerialNumbers = Console.ReadLine(); // 过滤掉禁止的特殊字符 char[] forbiddenChars = { '/', '%', '$', '#' }; freeTextSerialNumbers = new string(freeTextSerialNumbers.Where(c => !forbiddenChars.Contains(c)).ToArray());
两种方案各有优劣:实时拦截能让用户即时感知输入限制,避免无效输入;输入后过滤代码更简洁,适合对交互要求不高的场景。
内容的提问来源于stack exchange,提问作者Joshua Jaynes
相关产品推荐
相关产品推荐

