2016-09-30 3 views
1

私はこの種のパターンを持つファイルを読んでいます:(section1, section2, section3) ...しかし、フォーマットは保証されません。つまり、1つのセクションを別々の行に、多くのセクションを1行に扱わなければならないということです。また、各トークンのオフセットも保存する必要があります。JavaのMatcherは、whileループのマッチャの動作ですか?

`define a global matcher 
while() { 
    readSection1(matcher, other parameters); 
    readSection2(matcher, other parameters); 
    readSection3(matcher, other parameters); 
} 

あなたは私は私が停止した場所から開始することができますので、この正規表現を渡すためにしようとしていることがわかります。だから私はそれがオフセットとトークンを与えるためのMatcherを使用して、このようなコードを実行していますよ。しかし、今私は問題があります。私の最後のreadSection3メソッドが終了した後、私はマッチャーが最後を叩いていないことをテストしたので、私は読書の新しいラウンドを開始しました。 しかしwhileループに再び入り、私のreadSection1メソッドにmatcherを渡すと、突然matcherが終了しました!なぜそれが起こるだろうか?

は私も少しテストを実行します。

String loop = "a b c d e f g h i j k l"; 
Matcher loopMatcher = Pattern.compile("\\S+").matcher(loop); 
boolean loopEnded = false; 
while (!loopEnded) { 
use(loopMatcher); 
    if (loopMatcher.hitEnd()) { 
     loopEnded = true; 
    } 
} 

public static void use(Matcher matcher) { 
    if (!matcher.find()) { 
    System.out.println("loop not ended but matcher hit end"); 
    } 
} 

は、それはあまりにも、エラーメッセージを出力します。なぜ?!

さて、奇妙なことが起きましたが、私はこの小さなプログラムをもう一度実行しますが、エラーはなくなりましたが、まだ大きなプログラムに入っています。

答えて

0

Matcher.hitEnd()メソッドは、マッチャーによって見つかった最後の文字列が入力の最後にある場合にtrueを返します。したがって、ファイルの最後のセクションの後に文字がある場合、実際に最後のセクションであっても、Matcher.hitEnd()はfalseを返します。

ただし、テストコードを実行したが、エラーメッセージが表示されませんでした。テストと同じコードを投稿したことは確かですか?あなたが使用するマッチャーは、あなたが最初に初期化したものではありません( 'loopMatcher'と 'matcher')。

+0

おそらく私はこれをうまく説明しなかったでしょう。私は実際にスキャナを使って行を操作していますが、実際にはクラスセクションはありません。パターンはS1、S2、S3、S1、S2、S3です。私のreadSection3()が終了すると、次のループに入り、次のS1があればそれを読み込むはずです。したがって、最後のS3と次のS1が同じ行にある場合、私はどこから停止する必要があります。だから私は最後のS3の最後のトークンにとどまるはずだったので、私はMatcherを通過しているのです。そして、次のループに入り、readSection1()を呼び出すと、matcher.find()が呼び出され、section1に属する次のトークンが見つかるはずです。 – HM9527

+0

私のコードに誤字があります。今すぐ実行する必要があります。しかし、私はもう一度それを実行しようとすると、すべてが良い???????私はグローバルマッチャーでこれを修正しました!!!分???? ???? – HM9527

+0

しかし、私が固定版を使用しないと、私の他のプログラムはまだ間違っています...うーん、私はこれを再び歩かせてください。 – HM9527

関連する問題