2

次のコードがfalseを返すのはなぜですか?

Scanner sc = new Scanner("-v ");
sc.useDelimiter("-[a-zA-Z]\\s+");
System.out.println(sc.hasNext());

奇妙なことは-[a-zA-Z]//s+trueを返すことです。

また、これがtrueを返す理由も理解できません。

Scanner sc = new Scanner(" -v");
sc.useDelimiter("-[a-zA-Z]\\s+");
System.out.println(sc.hasNext());
4

2 に答える 2

6

スキャナーは、文字列をトークンに分割するために使用されます。区切り文字は、トークン間の区切り文字です。区切り文字は、スキャナーによって一致しないものです。それらは破棄されます。あなたは-[a-zA-Z]\\s+区切り文字であるスキャナーに言っています、そして-vその正規表現に一致するのでそれはそれをスキップします。

正規表現に一致する文字列を探している場合は、を使用しますString.matches()

文字列をトークンに分割することが本当に目標である場合はString.split()、を検討することもできます。これを使用すると便利な場合があります。

于 2013-03-19T00:46:57.547 に答える
1

John Kugelmanに感謝します、私はあなたが正しいと思います。

スキャナーは、カスタマイズされた区切り文字を使用して、入力をトークンに分割できます。デフォルトの区切り文字は空白です。

区切り文字がどの入力とも一致しない場合、すべての入力が1つのトークンとして生成されます。

    Scanner sc = new Scanner("-v");
    sc.useDelimiter( "-[a-zA-Z]\\s+");
     if(sc.hasNext())
          System. out.println(sc.next());

上記のコードでは、区切り文字は実際には一致しません。すべての入力「-v」は単一のトークンになります。 hasNext()は、次のトークンがあることを意味します。

    Scanner sc = new Scanner( "-v ");
    sc.useDelimiter( "-[a-zA-Z]\\s+");
     if(sc.hasNext())
          System. out.println(sc.next());

これは区切り文字と一致し、分割は0トークンで終わるため、hasNext()はfalseです。

于 2013-03-19T01:26:19.147 に答える