Scriu un client Telnet în C# și o parte din ceea ce trebuie să analizez sunt secvențele de evacuare ANSI / VT100, și anume doar cele folosite pentru culoare și formatare (detaliate aici ).
O metodă pe care o am este să găsesc toate codurile și să le elimin, astfel încât să pot reda textul fără formatare, dacă este necesar:
public static string StripStringFormating(string formattedString)
{
if (rTest.IsMatch(formattedString))
return rTest.Replace(formattedString, string.Empty);
else
return formattedString;
}
Sunt nou la expresii regulate și mi sa sugerat să folosesc acest lucru:
static Regex rText = new Regex(@"\e\[[\d;]+m", RegexOptions.Compiled);
Cu toate acestea, acest lucru a eșuat dacă codul de evacuare a fost incomplet din cauza unei erori la server. Deci, acest lucru a fost sugerat, dar prietenul meu a avertizat că ar putea fi mai lent (aceasta se potrivește, de asemenea, cu o altă condiție (z) pe care o voi întâlni mai târziu):
static Regex rTest =
new Regex(@"(\e(\[([\d;]*[mz]?))?)?", RegexOptions.Compiled);
Acest lucru nu numai că a funcționat, dar a fost de fapt mai rapid și a redus impactul asupra randării mele text. Poate cineva să explice unui începător regexp, de ce? :)