我正在用C#编写各种类型的Telnet客户端,我要解析的部分是ANSI / VT100转义序列,具体来说,只是那些用于颜色和格式化的(详见此处 )。

我有一个方法是找到所有代码并删除它们,所以如果需要,我可以在没有任何格式的情况下渲染文本:

    
public static string StripStringFormating(string formattedString)
{
    if (rTest.IsMatch(formattedString))
        return rTest.Replace(formattedString, string.Empty);
    else
        return formattedString;
}

我是正则表达式的新手,我被建议使用它:

static Regex rText = new Regex(@"\e\[[\d;]+m", RegexOptions.Compiled);

但是,如果由于服务器上的错误导致转义代码不完整,则会失败。 所以这是建议的,但我的朋友警告它可能会更慢(这个也符合我后来可能会遇到的另一个条件(z)):

static Regex rTest = 
              new Regex(@"(\e(\[([\d;]*[mz]?))?)?", RegexOptions.Compiled);

这不仅有效,而且实际上更快,并减少了对文本渲染的影响。 有人可以向正则表达式新手解释,为什么? :)

===============>>#1 票数:4

你真的想做两次正则表达式吗? 没有检查(坏我)我会认为这将很好地工作:

public static string StripStringFormating(string formattedString)
{    
    return rTest.Replace(formattedString, string.Empty);
}

如果确实如此,你应该看到它跑得快〜两倍......

===============>>#2 票数:3

#1较慢的原因是[\\ d;] +是一个贪婪的量词。 使用+? 要么 *? 会做懒惰的量化。 有关详细信息,请参阅MSDN - 量词

你可能想尝试:

"(\e\[(\d{1,2};)*?[mz]?)?"

这对你来说可能更快。

===============>>#3 票数:1

没有做详细的分析,我猜它因为问号而更快。 这些允许正则表达式“懒惰”,并且只要它们足够匹配就停止,而不是检查输入的其余部分是否匹配。

我对这个答案并不完全满意,因为这主要适用于*或+之后的问号。 如果我对输入更熟悉,那对我来说可能更有意义。

(另外,对于代码格式化,您可以选择所有代码并按Ctrl + K以使其添加所需的四个空格。)

===============>>#4 票数:1

我不确定这对你正在做什么有帮助,但很久以前我写了一个正则表达式来解析ANSI图形文件。

(?s)(?:\e\[(?:(\d+);?)*([A-Za-z])(.*?))(?=\e\[|\z)

它将返回每个代码以及与之关联的文本。

输入字符串:

<ESC>[1;32mThis is bright green.<ESC>[0m This is the default color.

结果:

[ [1, 32], m, This is bright green.]
[0, m, This is the default color.]

  ask by Nidonocu translate from so

未解决问题?本站智能推荐: