2011-01-21 16 views
3

私は文字の入力ストリームをテストしている正規表現を持っています。正規表現を入力と照合し、入力バッファ全体を消費する部分一致かどうかを判断する方法があるのだろうか?私。 regexpが完了する前に入力バッファの終わりに達します。より多くの入力文字を待つか、操作を中止するかを決定する実装をしたいと思います。すなわち部分正規表現の一致

は、私が真であるかを判断する必要があります

  1. 正規表現は、例えば

    に一致した前に、入力バッファの終わりに達しました"foo" =~ /^foobar/

  2. 正規表現は、例えば、完全に

    と一致します"foobar" =~ /^foobar/

  3. 正規表現は、例えば

    を一致させることができませんでした"fuubar" =~ /^foobar

入力がパケット化されていません。

答えて

0

これはあなたが解決しているシナリオですか?あなたは文字通りの文字列を待っています。 'foobar'。ユーザが部分一致を入力した場合、例えば、 'foo'、あなたは待っていたい。入力が一致しない場合は、終了します。

リテラル文字列で作業している場合は、文字を順番にテストするループを作成します。または、

If (input.Length < target.Length && target.StartsWith(input)) 
    // keep trying 

さらに複雑な正規表現にマッチさせようとしている場合は、正規表現でこれを行う方法がわかりません。しかし、私はプラットフォームが正規表現をどのように実装しているかについて詳しく読むことから始めます。

tom

0

これはあなたの質問ですが、
正規表現が一致するかどうか。そしてその表現は、可変量の入力と一致します。したがって、それは直接決定することはできません。

ただし、重複の可能性があると考えられる場合は、スマートバッファリングスキームを使用して同じことを達成することは可能です。

これを実行する方法はたくさんあります。

アサーションで一致しないものすべてを一致させることですが、最初に一致するものが見つかるまで(一致するものではありません)一致するものは一致しません。 これはバッファから簡単に投げ捨てることができます。あなたが求めるマッチを得たら、そのデータとデータのバッファをクリアしてください。

例:/(<function.*?>)|([^<]*)/バッファから捨てる/クリアする部分は、グループ2のキャプチャバッファにあります。

もう1つの方法は、有限の長さの文字列を一致させる場合です。 のバッファと一致しない場合は、バッファの先頭からバッファの最後からあなたが探している有限の文字列。

例:バッファのサイズは64kです。長さ10の文字列を検索しています。バッファーに文字列が見つかりませんでした。最後の10バイトを保持して(64k - 10)バイトを安全にクリアすることができます。次に、バッファの最後に(64k-10)バイトを追加します。もちろん、サイズが10バイトのバッファが必要です。常に1文字を削除/追加するだけですが、より大きなバッファを使用する方が効率的です。しきい値を使用してより多くのデータをリロードすることができます。

簡単に縮小/拡大するバッファを作成できる場合は、さらに多くのバッファリングオプションを使用できます。