为什么这个正则表达式更快?

Nid*_*ocu 16 regex ansi

我写各种各样的C#中的Telnet客户端和部分我有什么解析是ANSI/VT100转义序列,具体而言,只是那些用于颜色和格式(详细点击这里).

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

    
public static string StripStringFormating(string formattedString)
{
    if (rTest.IsMatch(formattedString))
        return rTest.Replace(formattedString, string.Empty);
    else
        return formattedString;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Rya*_*Fox 1

如果不做详细分析,我猜它会更快,因为有问号。这些允许正则表达式“惰性”,并在有足够的匹配时立即停止,而不是检查输入的其余部分是否匹配。

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

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