Java Scanner with regex delimiter

后端 未结 2 2112
心在旅途
心在旅途 2021-02-11 02:59

Why does the following code return false?

Scanner sc = new Scanner(\"-v \");
sc.useDelimiter(\"-[a-zA-Z]\\\\s+\");
System.out.println(sc.hasNext());
相关标签:
2条回答
  • 2021-02-11 03:39

    A scanner is used to break up a string into tokens. Delimiters are the separators between tokens. The delimiters are what aren't matched by the scanner; they're discarded. You're telling the scanner that -[a-zA-Z]\\s+ is a delimiter and since -v matches that regex it skips it.

    If you're looking for a string that matches the regex, use String.matches().

    If your goal really is to split a string into tokens then you might also consider String.split(), which is sometimes more convenient to use.

    0 讨论(0)
  • 2021-02-11 03:45

    Thanks John Kugelman, I think you're right.

    Scanner can use customized delimiter to split input into tokens. The default delimiter is a whitespace.

    When delimiter doesn't match any input, it'll result all the input as one token:

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

    In the code above, the delimiter actually doesn't get any match, all the input "-v" will be the single token. hasNext() means has next token.

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

    this will match the delimiter, and the split ended up with 0 token, so the hasNext() is false.

    0 讨论(0)
提交回复
热议问题