格式字符串基于控制台的格式代码

时间:2016-07-19 23:00:46

标签: c# .net

如何格式化带格式代码的字符串,以便为windows cmd设置格式化字符串?

所以基本上我有一个像ViewControllers这样的字符串。

当我将其输出到cmd时,它应显示为~b~Hello World~r~

据我所知,cmd有一些Unicode字符可以更改以下文本格式,但我不记得它们(类似于<blue from here on>Hello World<reset to normal>

所以我想的是:

\u00234

2 个答案:

答案 0 :(得分:2)

我认为你在谈论ANSI转义码。您可以阅读here

基本上你只需将ESCAPE字符('\ x1b'可用)发送到控制台,然后是'['字符。然后你发送你想要的颜色值,然后是'm'。

类似的东西:

Console.WriteLine("\x1b[31mRed\x1b[0;37m");

除非明确启用,否则Windows控制台支持非常有限。我相信Windows 10支持ANSI转义代码。

答案 1 :(得分:2)

据我所知,Windows控制台应用程序(如cmd.exe)中没有此类控制代码。有一些创造性的方法可以达到类似的效果。其中之一是How to echo with different colors in the Windows command line。我出于好奇而尝试了它,效果很好。它使用了一些jscript魔法。对于日常使用,如果您想要转义码格式化功能,您可能会发现其中一个bash shell模拟器更有用。 (How to develop in Linux-Like Shell (bash) on Windows?

<强>更新

我把一些非常快速和肮脏的东西拼凑在一起,以展示一种方法,使用类似于你在问题中使用的样式的“代码”。这可能不是“最好”的方式。但它可能会引发一个想法。

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));
        }
    }
}

我认为可能有办法让正则表达式捕获主要文本。但我没有太多时间去试验。我有兴趣看看是否有一种模式可以让正则表达式完成所有的工作。