从 c# 中删除特殊字符
本文关键字:特殊字符 删除 | 更新日期: 2023-09-27 18:33:44
我试图编写一个从控制台中删除特殊字符的函数。例如,如果我写:
Console.WriteLine("Hello World");
在我用字符"o"调用函数后,控制台将如下所示:
"Hell Wrld"
我想过在整个控制台上运行
Console.SetCursorPosition(i,j);
但我无法获得"光标位置"的值。
知道吗?
您可以读取已写入控制台的内容!
没有方法可以在 .NET 中读取控制台缓冲区,但是可以调用几个 WinAPI 函数来完成作业。
查看 GetStdHandle()、GetConsoleScreenBufferInfo() 和 ReadConsoleOutput()
您无法读取已写入控制台的内容。 但是,您可以做的一件事是提供自己的输出流。 您可以制作自己的TextWriter
实现,该实现与筛选器字符一起给定原始输出流。 然后,您可以将控制台的输出流设置为新的输出流,之后,每当有人写入您的程序输出流时,它都会过滤您选择的字符。
我使用以下代码行运行了一些简单的测试,它似乎工作正常。 如果它没有涵盖任何更复杂的情况,请告诉我。
public class FilteringTextWriter : TextWriter
{
private HashSet<char> invalidChars;
private TextWriter destinationStream;
public FilteringTextWriter(IEnumerable<char> invalidChars, TextWriter destinationStream)
: base()
{
this.invalidChars = new HashSet<char>(invalidChars);
this.destinationStream = destinationStream;
}
public override void Write(char value)
{
if (!invalidChars.Contains(value))
{
destinationStream.Write(value);
}
}
}
在美因河畔的其他地方或其他地方:
Console.SetOut(new FilteringTextWriter(new[] { 'o' }, Console.Out));
Console.CursorLeft
和Console.CursorTop
是光标位置的"get"方法。
您无法从控制台缓冲区读取,即无法获取已写入控制台的内容。(直接在 C# 中,但您可以使用本机 Windows API 或使用互操作来完成)。
因此,也许您最好将 Console 类包装在您自己的类中,并在将其写入屏幕之前过滤字符串,
public MyConsole
{
// expose the neede methods:
public void WriteLine(string text)
{
Console.WriteLine(text.Replace(...)); // filter out the special chars
}
}
然后使用 MyConsole
而不是 Console
。