2011-02-10 19 views
1

私は一連の正規表現を使ってファイルからトークンを解析しようとしています。私は改行を数え、それらの間にスペースを持たないトークンを分ける必要があります。残念ながら、java.util.ScannerのfindWithinHorizo​​n()メソッドは正規表現マッチのSTARTの残りの入力ストリーム全体(水平方向まで)を検索しますが、現在のファイル位置から始まる正規表現にマッチさせたいと思います。具体的には、私は正規表現の束を持っていて、ファイル内の現在のの位置から一致するものがどれかを調べるためにループしてから、ファイルの位置を正規表現の一致の直後に進めて、続行します。これは可能ですか?regexを使ってJavaでファイルを解析する方法は?

スキャナのnext()メソッドは、デリミタを強制し、正規表現がトークン全体と一致する必要があるため、これは役に立たないようです。私は現在のファイルの位置から一致したい、一致した文字列を取得し、一致後にファイルシークを進めたい。

+0

これらのファイルがどのくらいありますか?すぐにメモリに読み込むことはできますか? –

答えて

0

オプション:

  1. 文字列としてメモリにファイル全体を読んでください。次に、希望の位置に直接Matcherを使用します。

  2. RandomAccessFileから取得したFileChannelScannerの入力として使用します。その後、チャンネルの位置を直接操作することができます。

  3. 上記のようにFileChannelを使用しますが、柔軟性を高めるためにMatcherを直接使用してください。

のRandomAccessFileとのMatcherを使用する例:

FileChannel fc = file.getChannel(); 
fc.lock(); // so it doesn't change under you 

ByteBuffer bb = ByteBuffer.allocate(BUFFER_SIZE); 
CharBuffer cb = bb.asCharBuffer(); 

fc.read(bb); 
Matcher matcher = pattern.matcher(cb); 
// etc. 
+0

はいファイルをメモリに読み込むことができました。 2番目の方法では、現在の位置からデリミタなしで一致させるためにスキャナをどのように使用しますか?第1と第3の方法では、Matcherに現在の位置から開始し、一致した文字列を取得し、次の一致のためにそれを超えて進むように指示する方法を教えてください。ありがとう – MMM

+0

@MMM - デリミタを無視するように 'Scanner 'に指示することはできません。その目的はデリミタを見つけることです。 – OrangeDog

+0

@MMM - マッチ位置は 'Matcher.region()'で制御できます。 – OrangeDog

関連する問題