2012-04-09 9 views
1

に正規表現を適用する誰もがJavaのための良いストリーミング正規表現のパーサを知っていますか?特には、SAXストリーム

、私はどこコンテンツが指定した正規表現に一致することにより、XML要素のストリームの内容を見て、検出した場合とすることができるようにしたいです。たとえば、MediaWiki要素ストリームのコンテンツからSAXの "文字"コールバックを参照したいが、==([^ = \ n] +)==に一致する部分文字列がどこにあるかを検出する。

トリックは、一致ストリングは、おそらく複数のコールバックを横切って切断することができることを意味し、含有量が不定サイズのチャンクで来ることです。

簡単な解決策は、単純にすべてのコールバックをバッファリングし、長い文字列の上にJavaの組み込みの正規表現エンジンを実行するために、もちろん、です。残念ながら、それはあまりにも多くのメモリを消費します。

複雑で次のステップアップは、DFAに正規表現をオンにし、DFAが「受け入れ」状態に入るときを検出することです。私は、誰かがこのプロセスを単純化するJavaライブラリがあるかどうかを知りたいかどうか疑問に思っていました。

私はRagelを見てきました。コンパイル時にDFAを指定する必要があります。

+0

このような部分文字列は(あなたの例のように)1行にまたがるだけですが、最後の行(またはその2つ)をバッファリングするのはどうですか? – Qtax

+0

私は妥当な長さの線に頼ることはできません。いくつかのデータセットは、長い行のゴミで破壊されています。荒らしの検出は非常に難しいことではありませんが、私はこのアプローチを検討するのに数分を費やすと思いました。 – Zack

答えて

-1

はバッファ

+0

一部のタグには、数百MBのデータが含まれています。 – Zack

0

を破棄し、正規表現のためのタグが閉じられるたびにチェックし、それらのコールバックをバッファたぶんMatcherhitEndが、この場合に有用であるかもしれない:

このメソッドがtrueを返し、より多くの入力が最後の検索の結果を変更した可能性があります。

hitEndが真を返すが一致しない場合は、次のチャンクを追加してもう一度やり直す必要があります。

マッチャーが何らかの形で開始可能なインデックスを返しても大丈夫ですが、これは可能ではないようです。