根据控制台的格式化代码设置字符串格式
本文关键字:设置 字符串 格式 代码 格式化 控制台 | 更新日期: 2023-09-27 17:57:49
如何使用格式化代码格式化字符串,以便为windows cmd格式化字符串?
所以基本上我有一个类似~b~Hello World~r~
的字符串。
当我将它输出到cmd时,它应该显示为<blue from here on>Hello World<reset to normal>
。
就我所知,cmd有一些Unicode字符来更改以下文本格式,但我不记得了(类似于'u00234
)
所以我想到的是:
public string FormatString(string input)
{
input = Regex.Replace(input, "~b~", "<unicode for blue>", RegexOptions.IgnoreCase);
input = Regex.Replace(input, "~r~", "<Unicode for reset>", RegexOptions.IgnoreCase);
return input;
}
据我所知,在cmd.exe等Windows控制台应用程序中没有这样的控制代码。有一些创造性的方法可以实现类似的结果。其中之一是如何在Windows命令行中使用不同颜色进行回声。我出于好奇试了一下,效果很好。它使用了一些jscript魔术。对于日常使用,如果您想要转义代码格式化功能,您可能会发现其中一个bash-shell模拟器更有用。(如何在Windows上像Shell(bash)一样在Linux中进行开发?)
更新:
我把一些非常快速和肮脏的东西放在一起,展示了一种使用"代码"的方法,其风格与你在问题中使用的风格相似。这可能不是"最好"的方式。但这可能会引发一个想法。
class Program
{
static void Main(string[] args)
{
@"
This is in ~r~red~~ and this is in ~b~blue~~. This is just some more text
to work it out a bit. ~g~And now a bit of green~~.
".WriteToConsole();
Console.ReadKey();
}
}
static public class StringConsoleExtensions
{
private static readonly Dictionary<string, ConsoleColor> ColorMap = new Dictionary<string, ConsoleColor>
{
{ "r", ConsoleColor.Red },
{ "b", ConsoleColor.Blue },
{ "g", ConsoleColor.Green },
{ "w", ConsoleColor.White },
};
static public void WriteToConsole(this string value)
{
var position = 0;
foreach (Match match in Regex.Matches(value, @"~(r|g|b|w)~([^~]*)~~"))
{
var leadingText = value.Substring(position, match.Index - position);
position += leadingText.Length + match.Length;
Console.Write(leadingText);
var currentColor = Console.ForegroundColor;
try
{
Console.ForegroundColor = ColorMap[match.Groups[1].Value];
Console.Write(match.Groups[2].Value);
}
finally
{
Console.ForegroundColor = currentColor;
}
}
if (position < value.Length)
{
Console.Write(value.Substring(position, value.Length - position));
}
}
}
我认为可能有一种方法可以让正则表达式捕获前导文本。但我没有太多时间去做实验。我很想看看是否有一种模式可以让regex完成所有的工作。
我想你说的是ANSI转义码。你可以在这里读到它们。
基本上,您只需将ESCAPE字符('''x1b'有效)发送到控制台,然后再发送一个'['字符。然后,您发送所需的颜色值,然后再添加一个'm'。
类似于:
Console.WriteLine("'x1b[31mRed'x1b[0;37m");
除非你明确地打开Windows控制台,否则它的支持是非常有限的。我相信Windows 10支持ANSI转义码。