10

これはおそらく速攻です。このコードが何も返さないのはなぜですか?

import java.util.Scanner;

public class MainClass {

public static void main(String[] args) {
    try {

        Scanner sc = new Scanner("asda ASA adad");
        String pattern = "[A-Z]+";

        while ((sc.hasNext(pattern))) {

            System.out.println(sc.next(pattern));
        }
        sc.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}
4

3 に答える 3

18

hasNext(String pattern)true次のトークンがパターンに一致する場合にのみ返されます。あなたの場合、"asda"は次のトークンであり、一致しません"[A-Z]+"。ドキュメントは、「[the]スキャナーは入力を超えて前進しない」という点で明確です。

パターンを に変更すると"[A-Za-z]+"、3 つのトークンが得られますが、これは意図したものである可能性があります。

実際に に一致するトークンのみを取得したい場合"[A-Z]+"は、次のいずれかを実行できます。

  • 一致しないトークンを単に破棄する
  • useDelimiter("[^A-Z]+")、次に単に呼び出すnext()
  • 使用するskip("[^A-Z]+")
  • 使用するfindInLine("[A-Z]+")

ヒント: パフォーマンスが重要な場合はPattern、これらのメソッドのプリコンパイル済みオーバーロードを使用することをお勧めします。

ヒント: に"Xooo ABC"は 2 つの"[A-Z]+"一致があることに注意してください。これが望ましくない場合は、正規表現をもう少し複雑にする必要があります。または、一致しないトークンをいつでも単純に破棄できます。

于 2010-03-05T22:57:15.933 に答える
0

区切り文字で囲まれたすべての単語を印刷する場合は、安全を確保し、パターンを完全に除外することをお勧めします。そうすれば、プログラムがそのループを終了する原因となるパターンにない文字を含む単語に出くわすことはありません(現在のように)。例えば:

    while ((sc.hasNext())) {

        System.out.println(sc.next());
    }
于 2010-03-05T23:20:08.630 に答える
0

変化する

String pattern = "[A-Z]+";

String pattern = "[a-zA-Z]+";
于 2010-03-05T22:59:37.370 に答える