2008-08-07 21 views
15

私はC#で一種のTelnetクライアントを作成していますが、解析する必要があるのはANSI/VT100のエスケープシーケンスです。具体的には色と書式設定に使用されるものだけです(詳細here)。この正規表現はなぜ高速ですか?

私が持っている一つの方法は、すべてのコードを見つけて、それらを削除するものですので、必要であれば、私はフォーマットせずにテキストを描画することができます

 
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

詳細な分析をせずに、私は疑問符のために速いと思います。これにより正規表現は「怠惰」になり、残りの入力が一致するかどうかを調べるのではなく、一致するようになるとすぐに停止します。

これは主に*や+の後の疑問符に当てはまるため、私はこの回答には全く満足していません。私が入力にもっと慣れていれば、私にはもっと意味があるかもしれません。

(+ また、コードの書式設定のために、あなたのコードをすべて選択し、を押すことができますCtrlキー Kは、それが必要な4つのスペースを追加しています。)

3

理由は#1が遅くなる理由その[\ d;] +は欲張りの量子です。 +?または*?怠惰な量子化を行うつもりです。詳細については、MSDN - Quantifiersを参照してください。

あなたは試してみたいことがあります。

より速くあなたのためかもしれ
"(\e\[(\d{1,2};)*?[mz]?)?" 

3

本当にregexpを2回実行しますか?確認せずに(悪い私)私は、これがうまく機能するだろうと思っているだろう。それがない場合は

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

が、あなたはそれが〜倍の速度で実行表示されるはずです...

+0

は、への最初のチェックを実行するのと同じです一致するかどうかを確認してください。あなたは同じ結果を得る! – Nidonocu

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.] 
+0

この返答いただきありがとうございます。この表現を手元に残しておきますが、後で改善の可能性があることを後で確認します。 :)私が発見したように、「より大きい」正規表現は小さいものよりも速くなる傾向があります。 – Nidonocu

+0

.NETでANSIコードを使っていることにも興味があります。私は現在.NETよりもむしろ自分のサイトをやり直していますが、ANSIの解釈に.NETをどのように活用できるのか、いつも不思議です。 – lordscarlet

関連する問題