Java Scanner with regex delimiter

16,022

Solution 1

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.

Solution 2

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.

Share:
16,022
Sawyer
Author by

Sawyer

Updated on June 04, 2022

Comments

  • Sawyer
    Sawyer almost 2 years

    Why does the following code return false?

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

    The weird thing is -[a-zA-Z]//s+ will return true.

    I also can't understand why this returns true:

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