2009-04-04 8 views
8

Java I/Oストリームに正規表現を適用する例を示します。この正規表現は、ストリームを文字列に変換するだけではなく、バイナリデータを保存します。インターネット上のほとんどの例は、テキストデータに焦点を当てています。Java I/Oストリームへの正規表現の適用

+1

あなたは何をお探しですか?正規表現と一致しないデータを拒否しますか?そして、あなたが文字列に興味がないなら、あなたはどうしたいですか?いくつかの明確化は良いでしょう –

+0

明確化のために:文字への変換とバイナリデータへの変換は性能に影響するかもしれませんが、変換のために1バイトが失われることはありません。 – rwitzel

+0

可能な複製[ストリーム上で正規表現を実行する](http://stackoverflow.com/questions/3013669/performing-regex-on-a-stream) –

答えて

0

ストリームをバイト配列に変換します。

+0

これは入力をロードできるかどうかを意味するそのサイズとローディングに必要な時間の両方の条件でメモリに保存してください!つまり、信頼できるプログラムを作成するためにストリームが提供するデータの長さを知る必要があります。ストリームの入力長を知ることは、潜在的に無限のデータを提供するという目的と矛盾します! –

-2

正規表現操作は、バイナリデータのエンコードされたバイトである文字列に対して実行する必要があります。何バイトのデータで正規表現演算を実行することはできませんが、それらの表現は分かりません。

+8

-1私は同意しません。バイナリデータに正規表現を適用できない理由はありません。バイナリデータは、それらの表現が分からないという意味ではありません。 –

+0

おそらく、あなたは0と1のストリームを取り、正規表現を実行することができます。しかし、既存のJava APIのどれもが、より意味のある何かに変換せずに、その生のストリームにアクセスすることはできません。 –

+0

+1が合意、バイナリデータにregexpを適用することは意味がありません。正規表現は基本的にStringsに対応しています。文字列を使用して定義されているため、明示的または暗黙的に文字列エンコーディングを使用します。 –

9

Java Standardに必要な機能がありません。 jakarta regexp、具体的にはStreamCharacterIteratorクラスを使用する必要があります。このクラスは、正規表現演算で使用するためにInputStreamをカプセル化します。

あなたは、標準の正規表現のパッケージを使用したい場合は、私が代わりにCharacterIteratorCharSequenceを実装することで契約を締結し、前のクラスhereからソースを取得し、変更を示唆しています。

+1

CharSequenceを実装する際の1つの問題は、インターフェイスがクラスに 'public int length()'を実装する必要があることです。あなたがストリームから読んでいるなら、あなたは長さを知らず、正規表現エンジンへの答えを返すことができません。 – monkeysplayingpingpong

0

Ragel - トランジションのコールバックを持つ正規表現ツールを使用してください。

ストリームとチャンクに適用できます。