16

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

私が持っている 1 つの方法は、すべてのコードを見つけて削除することです。そのため、必要に応じて書式設定なしでテキストをレンダリングできます。

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

これは機能しただけでなく、実際には高速で、テキスト レンダリングへの影響を軽減しました。誰かが正規表現の初心者に説明できますか? :)

4

4 に答える 4

4

本当に正規表現を 2 回実行しますか? チェックしなくても(悪い私)、これはうまくいくと思っていたでしょう:

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

もしそうなら、あなたはそれが〜2倍速く走るのを見るはずです...

于 2008-09-09T21:36:28.560 に答える
3

#1が遅い理由は、[\d;]+が貪欲な数量詞であるためです。+を使用しますか?また *?怠惰な定量化を行います。詳細については、 MSDN-Quantifiersを参照してください。

あなたは試してみたいかもしれません:

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

それはあなたにとってより速いかもしれません。

于 2008-08-07T16:24:02.570 に答える
1

詳細な分析を行わなくても、クエスチョン マークのおかげで速いと思います。これらにより、正規表現を「遅延」させ、残りの入力が一致するかどうかをチェックするのではなく、一致するのに十分な数になるとすぐに停止します。

ただし、これは主に * または + の後の疑問符に適用されるため、この回答に完全に満足しているわけではありません。入力にもっと慣れていれば、もっと理にかなっているかもしれません。

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

于 2008-08-07T15:57:16.133 に答える
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.]
于 2008-09-17T15:31:46.340 に答える